php сигнал не обрабатывается сразу

У меня есть программное обеспечение, написанное на PHP, которое может работать долго, оно запускается через командную строку (не веб-приложение). Я хотел удостовериться, что вызывал функцию при выходе из программы, в том числе когда был убит с помощью ctrl + c. При уничтожении по сигналу функции выключения (деструкторы и функции, зарегистрированные через register_shutdown_fucntion ()) не вызываются.

После некоторого прочтения я понял, что мне нужно добавить обработчик для каждого соответствующего сигнала просто для вызова «exit;». Это решило мою проблему и работает.

Моя проблема в том, что в некоторых случаях сигнал обрабатывается не сразу. Это может занять секунды, минуты, а в некоторых случаях вообще не обрабатывается. Также как если бы код обработчика не был достигнут. Я действительно не знаю, где начать отлаживать это. Я пробовал другие сигналы (sigkill, sighup и т. Д.), Такое же поведение.

Мой код находится в этих скобках

declare(ticks=1)
{...}

Я не могу найти никакой корреляции между временем, когда к нему обращаются, и тем, к которому это не относится.

Любая помощь будет оценена.

0

Решение

Сигнал должен обрабатываться следующим образом:
Во-первых, вы должны сделать обработчик сигнала следующим образом:

function signalHandler($signo = null) {
$pid = posix_getpid();
switch ($signo) {
//case SIGKILL:
case SIGTERM:
case SIGINT:
case SIGKILL:
// unexpected shut down
exit(3);
break;
case SIGCHLD:
case SIGHUP:
// just ignore it
break;
case 10:
// user signal 1 received. Process exited normally
exit(0);
break;
case 12:
// user signal 2 received. Precess exited with a catched error
exit(3);
break;
default:
// ignore other signals
}
}

затем, в вашем основном процессе, вы должны сообщить PCNTL, что вы используете этот обработчик:

    pcntl_signal(SIGTERM, "signalHandler");
pcntl_signal(SIGINT, "signalHandler");
//  pcntl_signal(SIGKILL, "signalHandler"); // you can't override SIGKILL so it is useless
pcntl_signal(SIGCHLD, "signalHandler");
pcntl_signal(SIGHUP, "signalHandler");
pcntl_signal(10, "signalHandler");
pcntl_signal(12, "signalHandler");

Я использую это и, кажется, работает для 200 процессов, 8 процессов, работающих одновременно, и 10 секунд для каждого процесса.

Здесь, когда процесс завершается, он отправляет сигнал 10 или 12 (для успеха или ошибки), используя posix_kill($pid, 10)

0

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

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

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