php多进程pcntl学习-僵尸进程

Posted brady-wang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php多进程pcntl学习-僵尸进程相关的知识,希望对你有一定的参考价值。

 上个月写的文章,php多进程pcntl学习(一)现在发现并不完整,因为虽然提到了关闭子进程,但是并没有回收子进程,简单的说就是当子进程比父进程先退出,而父进程没对其做任何处理的时候,子进程将会变成僵尸进程。

<?php
$ppid = getmygid();
$pid = pcntl_fork();
if ($pid == -1){
die(\'fork failed\');
}else if($pid == 0){
$mypid = getmygid();
echo \'I am child process. My PID is \' . $mypid . \' and my father is\',$ppid.PHP_EOL;
exit(); //关闭子进程 ,需要配合pcntl_wait使用 , 否则通过ps aux | grep php - >[php] <defunct> 僵尸进程
}else{
echo \'Oh my god! I am a father now! My child is\'. $pid . \' and mine is \' . $ppid . PHP_EOL;
//pcntl_wait($status); //回收子进程,避免僵尸进程
}
//使主进程挂起
sleep(100);

  执行命令可以看见,子进程变为僵尸进程

  

  僵尸进程虽然不占什么内存,但是很碍眼,院子里一堆躺着的僵尸怎么都觉得怪怪的。(别忘了它们还占用着PID)

  把12行的注释打开,重新执行脚本测试 ps aux | grep php 可以发现子进程退出后就被回收了.顺便说下,通过信号也是能够做到的

  pcntl_signal(SIGCHLD, SIG_IGN);  //如果父进程不关心子进程什么时候结束,子进程结束后,内核会回收。 

  参考:http://www.jb51.net/article/56301.htm

以上是关于php多进程pcntl学习-僵尸进程的主要内容,如果未能解决你的问题,请参考以下文章

php如何把自身进程设置为系统进程

PHP孤儿进程

PHP孤儿进程

php 多进程

php多进程实例

PHP多进程学习__来初步了解一下PHP多进程及简单demo