2012-02-21 55 views
3

我有一個PHP腳本,它將任務分成多個部分,並在獨立的子進程中運行每個部分。代碼如下所示:php一些分叉進程繼續運行

foreach($users as $k => $arr) { 
    if(($pid = pcntl_fork()) === -1) continue; 
    if($pid) { 
     pcntl_wait($status,WNOHANG); 
     continue; 
    } 
    ob_start(); 
    posix_setsid(); 
    dbConnect(); 
    // do stuff to data 
    exit(); 
} 

我使用Debian服務器上的crontab運行此腳本,但問題是一些進程保持運行和備用內存。一段時間後,服務器的內存被淹沒。 我需要找到一種方法來確保所有進程都能正確完成。

回答

3

我認爲問題是在pcntl_wait調用中使用WNOHANG。這意味着pcntl_wait函數在子進程之前存在 - 您想要的,以便能夠併發地分叉其他子進程。但是它的副作用是主要父母在一些孩子面前完成。此鏈接http://www.devshed.com/c/a/PHP/Managing-Standalone-Scripts-in-PHP/2/描述瞭如何在WNOHANG中使用pcntl_wait進行循環,直到所有孩子完成。

+0

非常感謝它的工作現在父進程在退出之前等待所有的子進程結束運行。 – abugnais 2012-02-21 10:15:35

0

你對數據做的事情需要很長時間或永遠。您需要調試您執行的操作。

0

如果問題是Low memory你一定要規範你的代碼來擺脫這個問題,但如果問題僅僅是超過了頁面執行超時,您可以添加該行:

set_time_limit(0);