使用多進程的優勢:php
1. 使用多進程, 子進程結束之後, 內核會負責回收資源 2. 使用多進程,子進程異常退出不會致使整個進程Thread退出. 父進程還有機會重建流程. 3. 一個常駐主進程, 只負責任務分發, 邏輯更清楚.
PHP中實現多進程,Let's Go.html
咱們須要安裝pcnt擴展web
pcntl是process control的縮寫,一般,php會默認安裝這個擴展。使用phpinfo()函數查看擴展是否存在。服務器
使用pcntl_fork() 函數建立子進程函數
pcntl_fork做用就是建立和當前進程同樣的子進程,這個子進程代碼段和當前進程如出一轍,可是擁有本身的數據段。看一個最簡單的建立子進程的方法:spa
<?php /** * hedong * @date 2017-04-03 */ $parentPid = getmypid(); // 獲取父進程id $childPid = pcntl_fork(); // 建立子進程 switch($childPid) { case -1: print "建立子進程失敗!".PHP_EOL; exit; case 0: print "我是子進程,進程ID:{$childPid}".PHP_EOL; break; default: print "我是父進程,進程ID:{$parentPid},子進程ID: {$childPid}".PHP_EOL; } ?>
pcntl_fork()調用成功之後,一個程序變成了兩個程序:一個程序獲得的$pid變量值是0,它是子進程;另外一個程序獲得的$pid的值大於0,這個值是子進程的PID,它是父進程。
輸出結果:.net
子進程回收3d
① 阻塞方式
剛剛有ps麼?通常我習慣用ps aux加上grep命令來查找運行着的後臺進程。其中有一列STAT,標識了每一個進程的運行狀態。這裏,咱們關注狀態Z:殭屍(Zombie)。當子進程比父進程先退出,而父進程沒對其作任何處理的時候,子進程將會變成殭屍進程。殭屍進程雖然不佔什麼內存,可是很礙眼。(別忘了它們還佔用着PID)code
通常來講,在父進程結束以前回收掛掉的子進程就能夠了。在pcntl擴展裏面有一個pcntl_wait()函數,經過這個方法等待進程結束,而後回收已經結束的進程。htm
<?php /** * hedong * @date 2017-04-03 */ $parentPid = getmypid(); // 獲取父進程id $childPid = pcntl_fork(); // 建立子進程 switch($childPid) { case -1: print "建立子進程失敗!".PHP_EOL; exit; case 0: print "我是子進程,進程ID:{$childPid}".PHP_EOL; break; default: pcntl_wait($status); // 子進程執行完後才執行父進程 print "我是父進程,進程ID:{$parentPid},子進程ID: {$childPid}".PHP_EOL; }
② 非阻塞方式
阻塞方式失去了多進程的並行性。還有一種方法,既能夠回收已經結束的子進程,又能夠並行。這就是非阻塞的方式。
<?php /** * hedong * @date 2017-04-03 */ for ($i = 1; $i <= 5; ++$i) { $pid = pcntl_fork(); // 建立子進程 if (!$pid) { sleep(1); print "In child $i\n"; exit($i); } } // pcntl_waitpid 第一個參數爲 0 表明處理所有子進程 while (pcntl_waitpid(0, $status) != -1) { $status = pcntl_wexitstatus($status); echo "Child $status completed\n"; }
若是父進程先掛了怎麼辦?
會發生什麼?什麼也不會發生,子進程依舊還在運行。可是這個時候,子進程會被交給1號進程,1號進程成爲了這些子進程的繼父。1號進程會很好地處理這些進程的資源,當它們結束時1號進程會自動回收資源。因此,另外一種處理殭屍進程的臨時辦法是關閉它們的父進程。
最後須要注意的:
進程控制不能被應用在Web服務器環境,當其被用於Web服務環境時可能會帶來意外的結果。 -- 摘自PHP手冊
參考:
http://www.hackingwithphp.com/16/1/3/getting-into-multiprocessing http://www.jb51.net/article/71232.htm http://www.laruence.com/2009/06/11/930.html http://imhuchao.com/596.html https://www.pureweber.com/article/php-multi-process-programming-preview/
關注個人公衆號,一塊兒成長