php多程序防止出現殭屍程序

2022-06-15 20:12:14 字數 2349 閱讀 5090

對於用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生產,不管產後護理,實際上這樣並不符合主流價值觀,而且,作業系統本身資源有限,這樣無限生產不顧...