我想写一个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($pid,$status)的注释时,它就像一个护身符一样工作,从来没有任何问题。但我不想让父母等着做孩子的工作。任何事情都可能是有帮助的。
发布于 2013-01-20 10:05:46
您正在启动另一个程序/脚本,因此不需要任何派生,只需使用system()和screen获取终端(idk if & works)
发布于 2013-01-20 10:17:23
PCNTL函数,如pcntl_fork,不应该从web服务器使用,因为子进程最终不会得到正确的清理。(您一定已经注意到了。)这些函数主要用于独立的PHP守护进程,以及在这里不适用的特殊情况下使用。
改为使用更高级别的流程控制功能,如proc_open()。如果您需要在后台运行进程,请使用&通过shell运行它。
https://stackoverflow.com/questions/14420918
复制相似问题