Согласно PHP документации для pcntl_wait,pcntl_wait не прерывается SIGTERM
Функция ожидания приостанавливает выполнение текущего процесса, пока ребенок не вышел, или пока сигнал не подается, действие которого является прекращение тока или вызвать функцию обработки сигнала.
Однако, когда я запускаю следующий код и отправить SIGTERM родительского процессу с kill -s SIGTERM [pid]
обработчик сигнала вызывается только после того, как дочерних выходов (то есть я должен ждать сна, чтобы закончить. Если не pcntl_wait()
прерываться SIGTERM
fork_test.php:
<?php
declare(ticks = 1);
function sig_handler($signo) {
switch ($signo) {
case SIGTERM:
echo 'SIGTERM' . PHP_EOL;
break;
default:
}
}
pcntl_signal(SIGTERM, 'sig_handler');
$pid = pcntl_fork();
if ($pid == -1) {
die('could not fork');
}
else if ($pid) {
echo 'parent' . PHP_EOL;
pcntl_wait($status);
}
else {
echo 'child' . PHP_EOL;
sleep(30);
}
?>
Выход (SIGTERM появляется только после ожидания 30 секунд):
$ php fork_test.php
child
parent
SIGTERM
PHP Version => 5.3.3
Настройка перезапуска_событий на фальшивый трюк, хотя я не совсем понимаю, что происходит под капотом. – ThisSuitIsBlackNot
Ваше 'эхо' просто записывается в буфер, потому что вы не вызываете' flush'. Поскольку у вас было 'restart_syscalls' установлено значение true, системный вызов был перезапущен с эхом, все еще сидящим в буфере. –
В CLI требуется также флеш? (это то, что я использую). – ThisSuitIsBlackNot