對於用php進行多程序併發程式設計,不可避免要遇到殭屍程序的問題。
殭屍程序是指的父程序已經退出,而該程序dead之後沒有程序接受,就成為殭屍程序(zombie)程序。任何程序在退出前(使用exit退出) 都會變成殭屍程序(用於儲存程序的狀態等資訊),然後由init程序接管。如果不及時**殭屍程序,那麼它在系統中就會占用乙個程序表項,如果這種殭屍程序過多,最後系統就沒有可以用的程序表項,於是也無法再執行其它的程式。
方法一:
父程序通過pcntl_wait和pcntl_waitpid等函式等待子程序結束
1$pid =pcntl_fork();23
if($pid == -1) else
if ($pid
) else
方法二:
可以用signal函式為sigchld安裝handler,因為子程序結束後,父程序會收到該訊號,可以在handler中呼叫pcntl_wait或pcntl_waitpid來**。
1<?php
2declare(ticks = 1);34
//訊號處理函式
5function
sig_func()
1516 pcntl_signal(sigchld, 'sig_func');
1718
$pid =pcntl_fork();
1920
if($pid == -1) else
if ($pid
) else
如果子程序還沒有結束時,父程序就結束了,那麼init程序會自動接手這個子程序,進行**。
如果父程序是迴圈,又沒有安裝sigchld訊號處理函式呼叫wait或waitpid()等待子程序結束。那麼子程序結束後,沒有**,就產生殭屍程序了。
例如:
<?php$pid =pcntl_fork();
if($pid == -1)
else
if ($pid
) }
else
父程序是個死迴圈,也沒有安裝sigchld訊號處理函式,子程序結束後。我們通過如下命令檢視> ps -a -o stat,ppid,pid,cmd | grep -e
'^[zz]'
會發現乙個殭屍程序。
**改進一下:
1<?php
2declare(ticks = 1);34
//訊號處理函式
5function
sig_func()
1011 pcntl_signal(sigchld, 'sig_func');
1213
$pid =pcntl_fork();
1415
if($pid == -1) else
if ($pid
) 21 } else
當子程序結束後,再通過命令檢視時,我們發現這時就沒有殭屍程序了,這說明父程序對它進行了**。
方法三:
如果父程序不關心子程序什麼時候結束,那麼可以用pcntl_signal(sigchld, sig_ign)通知核心,自己對子程序的結束不感興趣,那麼子程序結束後,核心會**,並不再給父程序傳送訊號。
1<?php
2declare(ticks = 1);
34 pcntl_signal(sigchld,sig_ign);56
$pid =pcntl_fork();78
if($pid == -1) else
if ($pid
) 14 } else
當子程序結束後,sigchld訊號並不會傳送給父程序,而是通知核心對子程序進行了**。
方法四:
通過pcntl_fork兩次,也就是父程序fork出子程序,然後子程序中再fork出孫程序,這時子程序退出。那麼init程序會接管孫程序,孫程序退出後,init會**。不過子程序還是需要父程序進行**。我們把業務邏輯放到孫程序中執行,父程序就不需要pcntl_wait或pcntl_waitpid來等待孫程序(即業務程序)。
1<?php
2$pid =pcntl_fork();34
if($pid == -1) else
if ($pid
) else
else
if ($cpid
) else25}
26 }
子程序退出後,父程序**子程序,孫程序繼續業務邏輯的處理。當孫程序也執行完畢退出後,init**孫程序。
如何防止出現殭屍程序
include include int main else if pid 0 上述程式中,fork了乙個子程序,並且子程序很快就退出。父程序持續進行sleep,這樣子程序就變成了殭屍程序。利用ps命令可以清晰的看到這一點。leconte localhost ps axu greptest lecon...
PHP多程序中如何防止僵死程序
根據 unix環境高階程式設計 中的定義,僵死程序指的是 乙個已經終止 但是其父程序尚未對其進行善後處理 獲取終止子程序的有關資訊,釋放它仍占用的資源 的程序被稱為僵死程序 zombie 一旦某個程序fork了很多子程序,那麼除非父程序等待取得子程序的終止狀態,否則這些子程序終止後就會變成僵死程序。...
PHP多程序初探 孤兒和殭屍
實際上,你們一定要記住 php的多程序是非常值得應用於生產環境具備 值的生產力工具。但我認為在正式開始吹牛之前還是要說兩個基本概念 孤兒程序 殭屍程序。上篇我整篇尬聊的都是pcntl fork 只管fork生產,不管產後護理,實際上這樣並不符合主流價值觀,而且,作業系統本身資源有限,這樣無限生產不顧...