PHP分叉进程不会完全退出并变成僵尸

时间:2014-12-05 17:59:35

标签: php linux

这是一个简化的程序。

test.php是一个守护程序,总是在那里运行。 它要求进程处理某些任务。 完成工作后,分叉进程退出。 但是当分叉进程退出时,它就会变成僵尸。

如何让分叉进程完全退出而不会变成僵尸?

#!/usr/bin/php
<?php

while (1) {
  sleep(1);

  $pid = pcntl_fork();
  if (!$pid) {
    $mypid = getmypid();  
    sleep(5);
    print "pid=$mypid finish work \n";
    exit();
  }

  sleep(1);
} // while 

?>

./test.php
... daemon running ...

$ ps -ef | grep mqp
ubuntu   10084 10073  0 12:21 pts/0    00:00:00 /usr/bin/php ./test.php
ubuntu   10085 10073  0 12:21 pts/0    00:00:00 /usr/bin/php ./test.php
ubuntu   10074 10073  0 12:21 pts/0    00:00:00 [test.php] <defunct>
ubuntu   10075 10073  0 12:21 pts/0    00:00:00 [test.php] <defunct>

1 个答案:

答案 0 :(得分:0)

在父进程中,您需要不时致电pcntl_wait()pcntl_waitpid()。这些函数等待子进程退出然后返回其ID和状态。孩子使用的资源就是这种方式由操作系统发布,孩子不会变成僵尸。

退出的孩子的状态可以与pcntl_wexitstatus()以及pcntl扩展名中的其他功能一起使用,以了解孩子如何结束执行(正常终止并退回退出代码,终止用^ C,收到一个它没有处理的信号aso)