PHP forking工具生成僵尸进程

时间:2013-05-16 05:33:11

标签: php fork pcntl

我是PHP forking的新手,我只是从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);
}

但是当工具运行时,它将产生一个僵尸进程。我该怎么做才能阻止我们服务器上的僵尸或失效进程。请帮我。提前谢谢

1 个答案:

答案 0 :(得分:0)

zombie process是已终止但尚未读取退出状态的wait()。当其父级尚未(还)调用pcntl_wait()来读取该退出状态时,会发生这种情况。 {{3}}这是该调用,但必须为每个子调用,最有可能在分叉后的while($execute)中调用。此代码从不为前4个孩子调用它。