0

私は PHP フォークの初心者で、このコード サンプルを PHP.net からコピーしただけです。基本的に、デバイスを監視し、データをデータベースに保存するツールがあります。このツールはバックグラウンドで実行されています。

ここに私のコードがあります:

for(;;)
{
//build connection
$conn = mysql_connect(DB_HOST, DB_USERNAME, DB_PASSWORD);
//select db
mysql_select_db(DB_NAME);

$sql='SELECT * FROM tbl';
$query=mysql_query($sql,$conn);
$zpid=array();
while($res=mysql_fetch_assoc($query))
{

    $pid = pcntl_fork();
    $execute=0;
    if ($pid == -1) 
    {
       echo("could not fork");
    } 
    elseif ($pid) 
    {

        $execute++;
        //pcntl_wait($status);
        if ($execute>=5)
        {
            $child=pcntl_wait($status);
            if($child)
            {
                $execute--;
                echo 'exited child'.$child;
            }

        }
    } 
    else 
    {
        $obj=new Monitor($res['ip'],$res['community_string'],$res['id']);
        $obj->execute();

        //save
        $obj->insert_data();
       sleep(10);   
       exit();
    }
}

mysql_close($conn);
sleep(60);
}

しかし、ツールを実行すると、ゾンビ プロセスが生成されます。サーバー上でこのゾンビプロセスまたは機能していないプロセスを防ぐにはどうすればよいですか? 私を助けてください。前もって感謝します

4

1 に答える 1

0

ゾンビプロセスとは、終了したが、まだ終了ステータスが読み取られていないプロセスです。これは、その親が (まだ)終了ステータスを読み取るためにwait()を呼び出していない場合に発生します。ここでpcntl_wait()がその呼び出しですが、おそらくフォークの後で、各 child に対して呼び出す必要があります。while($execute)このコードは、最初の 4 つの子に対してそれを呼び出すことはありません。

于 2013-05-16T05:41:28.360 に答える