pthreads — завершение процесса php с использованием pcntl_signal при запуске потока

При запуске потока функция, зарегистрированная с 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

1

Решение

Ваш основной поток игнорирует зарегистрированный сигнал при попытке присоединиться к потоку. Это по сути то, что происходит после $task->start(),

Вы должны сделать две вещи:

  1. Найдите способ, чтобы ваш основной поток реагировал на сигнал.
  2. Остановить выполнение потока, чтобы он не блокировался 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 например.

0

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

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

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