上個月寫的文章,php多進程pcntl學習(一)如今發現並不完整,由於雖然提到了關閉子進程,可是並無回收子進程,簡單的說就是當子進程比父進程先退出,而父進程沒對其作任何處理的時候,子進程將會變成殭屍進程。php
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);
執行命令能夠看見,子進程變爲殭屍進程html
殭屍進程雖然不佔什麼內存,可是很礙眼,院子裏一堆躺着的殭屍怎麼都以爲怪怪的。(別忘了它們還佔用着PID)post
把12行的註釋打開,從新執行腳本測試 ps aux | grep php 能夠發現子進程退出後就被回收了.順便說下,經過信號也是可以作到的學習
pcntl_signal(SIGCHLD, SIG_IGN); //若是父進程不關心子進程何時結束,子進程結束後,內核會回收。
測試
參考:http://www.jb51.net/article/56301.htmurl