У меня есть 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);
}?>
Вы не хотите вариант 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);
}
Других решений пока нет …