Инструмент разветвления PHP создает зомби-процесс

Я новичок в разветвлении 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);
}

Но когда инструмент запустится, он создаст зомби-процесс. Что я буду делать, чтобы предотвратить этот зомби или несуществующий процесс на нашем сервере. Пожалуйста помогите. заранее спасибо


person Rey Papellero    schedule 16.05.2013    source источник
comment
что такое зомби-процесс?   -  person NullPoiиteя    schedule 16.05.2013
comment
Не используйте mysql_* функции в новом коде. Они больше не поддерживаются и официально объявлены устаревшими. Видите красное поле? Узнайте о подготовленных операторах и используйте PDO или MySQLэта статья поможет вам определиться. Если вы выберете PDO, вот хороший учебник.   -  person NullPoiиteя    schedule 16.05.2013


Ответы (1)


зомби-процесс — это процесс, который завершился, но еще не был прочитан его статус завершения. Это происходит, когда его родитель (еще) не вызвал wait(), чтобы прочитать это статус выхода. pcntl_wait() вот этот вызов, но он должен называться для каждого дочернего элемента, скорее всего, в while($execute) после развилки. Этот код никогда не вызывает его для первых 4 дочерних элементов.

person Yann Vernier    schedule 16.05.2013
comment
спасибо за ваш ответ .. в моей реализации я хочу, чтобы одновременно работало не более пяти нескольких процессов. как я буду отслеживать первые 4 дочерних процесса, которые будут вызываться wait(), чтобы прочитать этот статус выхода? - person Rey Papellero; 16.05.2013