process — дочерние процессы не завершаются должным образом

У меня есть следующий скрипт PHP. Мне нужно выполнить 5 разных задач с 5 разными дочерними процессами (используя функцию pcntl_fork ()). Чайлдс созданы правильно и они делают свое дело, но кажется, что они никогда не выходят. Родители ждут, пока они закончатся, но этого никогда не случится. Кто-нибудь может сказать мне, что я делаю не так?

<?php
for ($i=1; $i<=5; $i++) {
$pid = pcntl_fork();

if ($pid == -1) {
die("Error Creating subprocess ".$i);
exit(-1);
}
else if (!$pid) {

switch ($i) {
case 1:
// Child 1
error_log("I\'m the child number ".$i." PID: ".getmypid()."\n", 3, "/var/log/php_errors.log");
//Doing some stuff
exit;
case 2:
// Child 2
error_log("I\'m the child number ".$i." PID: ".getmypid()."\n", 3, "/var/log/php_errors.log");
//Doing some stuff
exit;
case 3:
// Child 3
error_log("I\'m the child number ".$i." PID: ".getmypid()."\n", 3, "/var/log/php_errors.log");
//Doing some stuff
exit;
case 4:
// Child 4
error_log("I\'m the child number ".$i." PID: ".getmypid()."\n", 3, "/var/log/php_errors.log");
//Doing some stuff
exit;
case 5:
// Child 5
error_log("I\'m the child number ".$i." PID: ".getmypid()."\n", 3, "/var/log/php_errors.log");
//Doing some stuff
exit;
default:
break;
}
}
else {
$pids[] = $pid;
}
}

error_log("Luke, I\'m your father. PID: ".getmypid()."\n", 3, "/var/log/php_errors.log");
foreach ($pids as $key => $child) {
$res = pcntl_waitpid($child, $status);
//Check if this child has exited normally
if (pcntl_wifexited($status))
error_log("Child ".$child." has ended\n", 3, "/var/log/php_errors.log");
else
error_log("Child ".$child." is zombie\n", 3, "/var/log/php_errors.log");

if($res == -1 || $res > 0)
unset($pids[$key]);
}
?>

2

Решение

<?php
for ($i=1; $i<=5; $i++) {
$pid = pcntl_fork();

if ($pid == -1) {
die("Error Creating subprocess ".$i);
exit(-1);
}
else if (!$pid) {

switch ($i) {
case 1:
// Child 1
error_log("I\'m the child number ".$i." PID: ".getmypid()."\n", 3, "/var/log/php_errors.log");
//Doing some stuff
exit;
case 2:
// Child 2
error_log("I\'m the child number ".$i." PID: ".getmypid()."\n", 3, "/var/log/php_errors.log");
//Doing some stuff
exit;
case 3:
// Child 3
error_log("I\'m the child number ".$i." PID: ".getmypid()."\n", 3, "/var/log/php_errors.log");
//Doing some stuff
exit;
case 4:
// Child 4
error_log("I\'m the child number ".$i." PID: ".getmypid()."\n", 3, "/var/log/php_errors.log");
//Doing some stuff
exit;
case 5:
// Child 5
error_log("I\'m the child number ".$i." PID: ".getmypid()."\n", 3, "/var/log/php_errors.log");
//Doing some stuff
exit;
default:
break;
}
}
else {
$pids[$pid] = $pid;
}
}

while (!empty($pids)) {
if ($child = pcntl_wait($status, WNOHANG)) {
if (pcntl_wifexited($status))
error_log("Child ".$child." has ended\n", 3, "/var/log/php_errors.log");
else
error_log("Child ".$child." is zombie\n", 3, "/var/log/php_errors.log");
unset($pids[$child]);
} else
usleep(100);
}

Не забудьте изменить $ pids [] = $ pid; $ pids [$ pid] = $ pid; : o) или выбери лучший способ выскочить из массива вышедшего потомка.

0

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

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

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