2012-02-21 58 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);