У меня есть программное обеспечение, написанное на PHP, которое может работать долго, оно запускается через командную строку (не веб-приложение). Я хотел удостовериться, что вызывал функцию при выходе из программы, в том числе когда был убит с помощью ctrl + c. При уничтожении по сигналу функции выключения (деструкторы и функции, зарегистрированные через register_shutdown_fucntion ()) не вызываются.
После некоторого прочтения я понял, что мне нужно добавить обработчик для каждого соответствующего сигнала просто для вызова «exit;». Это решило мою проблему и работает.
Моя проблема в том, что в некоторых случаях сигнал обрабатывается не сразу. Это может занять секунды, минуты, а в некоторых случаях вообще не обрабатывается. Также как если бы код обработчика не был достигнут. Я действительно не знаю, где начать отлаживать это. Я пробовал другие сигналы (sigkill, sighup и т. Д.), Такое же поведение.
Мой код находится в этих скобках
declare(ticks=1)
{...}
Я не могу найти никакой корреляции между временем, когда к нему обращаются, и тем, к которому это не относится.
Любая помощь будет оценена.
Сигнал должен обрабатываться следующим образом:
Во-первых, вы должны сделать обработчик сигнала следующим образом:
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)
Других решений пока нет …