国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > PHP > 正文

談PHP CLI模式下的多進程應用

2024-05-04 21:52:09
字體:
來源:轉載
供稿:網(wǎng)友

PHP在很多時候不適合做常駐的SHELl進程, 他沒有專門的gc例程, 也沒有有效的內存管理途徑. 所以如果用PHP做常駐SHELL, 你會經(jīng)常被內存耗盡導致abort而unhappy.
而且, 如果輸入數(shù)據(jù)非法, 而腳本沒有檢測, 導致abort, 也會讓你很不開心.

那? 怎么辦呢?

呵呵, 別著急, 多進程來幫您!

那,這是為什么呢?

優(yōu)點:

1. 使用多進程, 子進程結束以后, 內核會負責回收資源

2. 使用多進程,子進程異常退出不會導致整個進程Thread退出. 父進程還有機會重建流程.

3. 一個常駐主進程, 只負責任務分發(fā), 邏輯更清楚.


Then, 怎么做呢?

接下來, 我們使用PHP提供的POSIX和Pcntl系列函數(shù), 來實現(xiàn)一個PHP命令解析器, 主進程負責接受用戶輸入, 然后fork子進程執(zhí)行, 并負責回顯子進程的結束狀態(tài).
代碼如下, 我加了注釋, 如果有不懂的地方, 可以翻閱手冊相關函數(shù), 或者回復留言.

#!/bin/env php<?php
/** A example denoted muti-process application in php
* @filename fork.php
* @touch date Wed 10 Jun 2009 10:25:51 PM CST
* @author Laruence<laruence@baidu.com>
* @license http://www.zend.com/license/3_0.txt   PHP License 3.0
* @version 1.0.0
*/
/** 確保這個函數(shù)只能運行在SHELL中 */
if
(substr(php_sapi_name(), 0, 3) !== 'cli')
{
die("This Programe can only be run in CLI mode");
}
/**  關閉最大執(zhí)行事件限制, 在CLI模式下, 這個語句其實不必要 */
set_time_limit(0);

$pid  = posix_getpid(); //取得主進程ID
$user = posix_getlogin(); //取得用戶名
echo
<<<EOD
USAGE: [command | expression]
input php code to execute by fork a new process
input quit to exit

        Shell Executor version 1.0.0 by laruence
EOD;
while
(true)
{
$prompt = "/n{$user}$ ";
        $input  = readline($prompt);

        readline_add_history($input);
        if
($input == 'quit')
{
break;
        }
process_execute($input . ';');
}
exit(0);

function
process_execute($input)
{
$pid = pcntl_fork(); //創(chuàng)建子進程
if
($pid == 0)
{//子進程
$pid = posix_getpid();
                echo
"* Process {$pid} was created, and Executed:/n/n";
                eval($input); //解析命令
exit;
        }
else
{//主進程
$pid = pcntl_wait($status, WUNTRACED); //取得子進程結束狀態(tài)
if
(pcntl_wifexited($status))
{
echo
"/n/n* Sub process: {$return['pid']} exited with {$status}";
                }
}
}


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 云浮市| 措美县| 太康县| 山东省| 钟山县| 桐乡市| 眉山市| 平果县| 门源| 宁陕县| 五原县| 文登市| 盐边县| 巩义市| 安仁县| 梁河县| 五家渠市| 磐石市| 沾益县| 汪清县| 宜兰市| 锦屏县| 玛沁县| 五大连池市| 汉沽区| 寿宁县| 饶平县| 神木县| 疏附县| 新闻| 汽车| 龙胜| 新晃| 贺州市| 黑山县| 柳林县| 东乡族自治县| 天峻县| 宝坻区| 鄂伦春自治旗| 尼木县|