1. 程式人生 > >php多進程pcntl學習-僵屍進程

php多進程pcntl學習-僵屍進程

log stat 註釋 現在 mine htm lse 避免 通過

 上個月寫的文章,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學習-僵屍進程