2012-02-21 6 views
3

私は、タスクを複数の部分に分割し、それぞれの部分を別々の子プロセスで実行するphpスクリプトを持っています。コードは次のようになります。phpいくつかのforkされたプロセスが動作し続ける

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/は、すべての子が完了するまでpcntl_waitとWNOHANGを使ってループする方法を説明しています。問題は、あなたがこの問題を取り除くためにあなたのコードを正規化する必要がありますが、問題は単にページの実行のタイムアウトを超えている場合、あなたは行を追加することがLow memoryある場合

+0

おかげで、それが働いたたくさん親プロセスは、すべての子プロセスが終了して終了するまで待機します。 – abugnais

0

データに行う作業は、長くかかりますか、永遠にかかります。実行する操作をデバッグする必要があります。

0

set_time_limit(0); 
関連する問題