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 回答