При запуске потока функция, зарегистрированная с pcntl_signal
никогда не уволят.
<?php
declare(ticks = 1);
class Task extends Thread {
public function run () {
while (1) sleep(1); // run forever
}
}
function shutdown () { // never runs :(
echo "Good bye!\n"; exit;
}
pcntl_signal(SIGTERM, 'shutdown');
$task = new Task;
$task->start();
Затем в терминале:
# kill -TERM 123
Работает нормально, когда нет потока:
<?php
declare(ticks = 1);
class Task {
public function run () {
while (1) sleep(1); // run forever
}
}
function shutdown () {
echo "Good bye!\n"; exit;
}
pcntl_signal(SIGTERM, 'shutdown');
$task = new Task;
$task->run();
Как я могу выполнить некоторый код при отправке SIGTERM при запуске потока?
Я использую: php-5.6.7, pthreads-2.0.10, debian-7
Ваш основной поток игнорирует зарегистрированный сигнал при попытке присоединиться к потоку. Это по сути то, что происходит после $task->start()
,
Вы должны сделать две вещи:
exit
.Что касается 1, вы можете поместить свой основной поток в бесконечное sleep
петля. В то время как PHP sleep
Однако он все еще может реагировать на сигналы.
И 2, вы могли бы kill
нить в вашем shutdown
функция.
После $task->start()
:
for (;;) {
sleep(PHP_INT_MAX);
}
Изменено shutdown
функция:
function shutdown ()
{
echo "Good bye!\n";
$GLOBALS['task']->kill();
exit;
}
Примечание: не используйте kill
в реальном мире. Найдите метод, позволяющий потоку грациозно завершаться самостоятельно.
Я не буду рекомендовать использовать declare(ticks = 1)
, это плохо для производительности. Попробуйте использовать pcntl_signal_dispatch () вместо sleep
например.
Других решений пока нет …