Я знаю, что это на 8 лет позже (и я надеюсь, что вы нашли ответ), но на всякий случай это поможет кому-то другому, я собираюсь ответить.
Использование функций pcntl_w * будет вашим другом здесь, и вы, вероятно, захотите внедрить процессный жнец. Документация не очень полезна и не содержит полезных примеров.
Это будет процесс, состоящий из нескольких частей:
1 - использовать pcntl_signal для отправки захваченных сигналов вашему обработчику сигналов
2 - Выполните ваш цикл / опрос и внутри этого цикла;
3 - Итерация по массиву ваших детей (который вы создадите ниже) и пожинайте их при необходимости
4 - fork (): это будет состоять из следующего:
pcntl_async_signals(true);
$children = array();
while ($looping === true)
{
reapChildren();
if (($pid = pcntl_fork()) exit (1); // error
elseif ($pid) // parent
{
$children[] = $pid;
// close files/sockets/etc
posix_setpgid ($pid,posix_getpgrp());
}
else
{ // child
posix_setpgid(posix_getpid(),posix_getppid());
// ... jump to child function/object/code/etc ...
exit (0); // or whatever code you want to return
}
} // end of loop
В жатке вам понадобится следующее:
function reapChildren()
{
global $children;
foreach ($children as $idx => $pid)
{
$rUsage = array();
$status = 0; // integer which will be used as the $status pointer
$ret = pcntl_waitpid($pid, $status, WNOHANG|WUNTRACED, $rUsage);
if (pcntl_wifexited($status)) // the child exited normally
{
$exitCode = pcntl_wexitstatus($status); // returns the child exit status
}
if (pcntl_wifsignaled($status)) // the child received a signal
{
$signal = pcntl_wtermsig($status); // returns the signal that abended the child
}
if (pcntl_wifstopped($status))
{
$signal = pcntl_wstopsig($status); // returns the signal that stopped the child
}
}
}
Приведенный выше код жнеца позволит вам опрашивать статус ваших детей, и если вы используете php7 +, массив $ signalInfo, который заполняется в вашем обработчике сигналов, будет содержать много полезной информации, которую вы можете использовать .. var_dump it .. проверить это. Кроме того, использование pcntl_async_signals (true) в php7 + заменяет необходимость объявления (ticks = 1) и ручного вызова pcntl_signal_dispatch ();
Надеюсь, это поможет.