我是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);
}
但是当工具运行时,它将产生一个僵尸进程。我该怎么做才能阻止我们服务器上的僵尸或失效进程。请帮我。提前谢谢
答案 0 :(得分:0)
zombie process是已终止但尚未读取退出状态的wait()。当其父级尚未(还)调用pcntl_wait()来读取该退出状态时,会发生这种情况。 {{3}}这是该调用,但必须为每个子调用,最有可能在分叉后的while($execute)
中调用。此代码从不为前4个孩子调用它。