在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
上个月写的文章,php多进程pcntl学习(一)现在发现并不完整,因为虽然提到了关闭子进程,但是并没有回收子进程,简单的说就是当子进程比父进程先退出,而父进程没对其做任何处理的时候,子进程将会变成僵尸进程。 1 <?php 2 $ppid = getmygid(); 3 $pid = pcntl_fork(); 4 if ($pid == -1){ 5 die('fork failed'); 6 }else if($pid == 0){ 7 $mypid = getmygid(); 8 echo 'I am child process. My PID is ' . $mypid . ' and my father is',$ppid.PHP_EOL; 9 exit(); //关闭子进程 ,需要配合pcntl_wait使用 , 否则通过ps aux | grep php - >[php] <defunct> 僵尸进程 10 }else{ 11 echo 'Oh my god! I am a father now! My child is'. $pid . ' and mine is ' . $ppid . PHP_EOL; 12 //pcntl_wait($status); //回收子进程,避免僵尸进程 13 } 14 //使主进程挂起 15 sleep(100); 执行命令可以看见,子进程变为僵尸进程
僵尸进程虽然不占什么内存,但是很碍眼,院子里一堆躺着的僵尸怎么都觉得怪怪的。(别忘了它们还占用着PID) 把12行的注释打开,重新执行脚本测试 ps aux | grep php 可以发现子进程退出后就被回收了.顺便说下,通过信号也是能够做到的 pcntl_signal(SIGCHLD, SIG_IGN); 参考:http://www.ogeek.net/article/56301.htm |
2022-08-17
2022-09-18
2022-08-17
2022-08-13
2022-08-15
请发表评论