fork — PHP pcntl_wait () не ожидает дочернего выхода

У меня есть PHP-скрипт, который разветвляется и родительские вызовы pnctl_wait (). Согласно инструкции php, pcntl_wait () должен приостанавливать выполнение текущего процесса до выхода из дочернего процесса. Но этого не происходит.
Родительский процесс вообще не ждет и сразу выполняет следующую строку.

Я попытался воспроизвести проблему в небольшом примере сценария ниже

<?php
$parentpid=getmypid();
declare(ticks=1);
$apid = pcntl_fork();
if ($apid == -1) {
die('could not fork for client '.$client);
} else if ($apid) {     //parentpcntl_wait($status,WNOHANG); //Protect against Zombie children
/* Parent does not wait here */

print "PARENT $parentpid has forked $apid \n";

sleep(100);
} else { // child
$pid = getmypid();
print "CHILD $pid  is sleeping\n";
sleep(40);
}?>

0

Решение

Вы не хотите вариант WNOHANG Вот. Просто используйте:

pcntl_wait($status);

Если вы пройдете WNOHANG pcntl_wait() не буду ждать детей, чтобы вернуться. Он сообщает только о детях, которые уже было прекращено.


Весь пример должен выглядеть так:

$parentpid = getmypid();
$apid = pcntl_fork();

if ($apid == -1) {
die('could not fork for client '.$client);
} else if ($apid) {
// Parent process
print "PARENT $parentpid has forked $apid \n";

// Wait for children to return. Otherwise they
// would turn into "Zombie" processes
pcntl_wait($status);
} else {
// Child process
$pid = getmypid();
print "CHILD $pid  is sleeping\n";
sleep(40);
}
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]