杀叉过程

时间:2013-01-20 01:47:51

标签: php pcntl

我想写一个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);它永远都像一个没有任何问题的魅力。但我不希望父母等待孩子的工作。 任何事情都有帮助。

2 个答案:

答案 0 :(得分:0)

您正在启动另一个程序/脚本,因此您不需要任何分叉,只需使用system()screen来接收终端(idk如果& works)

答案 1 :(得分:0)

PHP的PCNTL函数(如pcntl_fork)不应在Web服务器上使用,因为子进程最终无法正常清理。 (毫无疑问你会注意到。)这些函数主要用于独立的PHP守护进程,以及在这里不适用的特殊情况。

使用更高级别的过程控制功能,例如proc_open()。如果您需要在后台运行流程,请通过带有&的shell运行它。