我想写一个php脚本在后台运行。那需要pcntl_fork。 我用这个函数来分叉一个孩子:
function launchchild($programexe,$programvars)
{
//foreach ($tasks as $key => $v){
switch ($pid = pcntl_fork()) {
case -1:
// @fail
die('Fork failed');
break;
case 0:
// @child: Include() misbehaving code here
pcntl_exec($programexe,$programvars);
break;
default:
// @parent
//pcntl_waitpid($pid, $status);
break;
}
//print "Done! :^)\\n\\n";
}
我在一分钟内用如下的片段称呼它:
$parameters = array('/Applications/XAMPP/xamppfiles/htdocs/ping/senario2/master/gather_checks.php', $serialize_triagger, $server_list[$server_choose]);
launchchild('/Applications/XAMPP/xamppfiles/bin/php',$parameters); // fork a child for parallel processing.
所以,它只能在一段时间内优雅地运作。 我用'ps -ax |检查了这个过程grep php'。我看到有这么多的过程永远不会结束,直到代码会给出35错误,这意味着我们没有更多的内存来运行它! 这是'ps -ax |的结果grep php'
ps -ax | grep php
12020 ttys001 0:00.07 /Applications/XAMPP/xamppfiles/bin/php /Applications/XAMPP/xamppfiles/htdocs/ping/senario2/master/main.php
12021 ttys001 0:00.00 (php-5.3.1)
12022 ttys001 0:00.00 (php-5.3.1)
12025 ttys001 0:00.00 (php-5.3.1)
12028 ttys001 0:00.00 (php-5.3.1)
12037 ttys001 0:00.00 (php-5.3.1)
12040 ttys001 0:00.00 (php-5.3.1)
12043 ttys001 0:00.00 (php-5.3.1)
当我取消注释// pcntl_waitpid($ pid,$ status);它永远都像一个没有任何问题的魅力。但我不希望父母等待孩子的工作。 任何事情都有帮助。
答案 0 :(得分:0)
您正在启动另一个程序/脚本,因此您不需要任何分叉,只需使用system()
和screen
来接收终端(idk如果& works)
答案 1 :(得分:0)
PHP的PCNTL函数(如pcntl_fork
)不应在Web服务器上使用,因为子进程最终无法正常清理。 (毫无疑问你会注意到。)这些函数主要用于独立的PHP守护进程,以及在这里不适用的特殊情况。
使用更高级别的过程控制功能,例如proc_open()
。如果您需要在后台运行流程,请通过带有&
的shell运行它。