Я пытаюсь выполнить какой-то окончательный код после того, как мой скрипт был прерван в PHP. Так скажем, у меня есть этот скрипт:Выполнить код после сценария abort на CLI
while(true) {
echo 'loop';
sleep(1);
}
, если я выполнить скрипт с $ php script.php
его запуска до ухода заданного времени выполнения.
Теперь мне нравится выполнять какой-то окончательный код после того, как сценарий был прерван. Так что, если я
- ударил
Ctrl+C
- время выполнения является более
Есть даже возможность сделать некоторые очистки в этих случаях?
Я попробовал его с pcntl_signal
, но не повезло. Также с register_shutdown_function
, но это вызывается только при успешном завершении сценария.
UPDATE
Я узнал (ТНХ на ссылку RCH), что я как-то можно "поймать" события с:
pcntl_signal(SIGTERM, $restartMyself); // kill
pcntl_signal(SIGHUP, $restartMyself); // kill -s HUP or kill -1
pcntl_signal(SIGINT, $restartMyself); // Ctrl-C
Но если я расширяю свой код с
$cleanUp = function() {
echo 'clean up';
exit;
};
pcntl_signal(SIGINT, $cleanUp);
сценарий продолжает выполнение, но не соблюдает код в $cleanUp
закрытии, если я ударил Ctrl+C
.
Thx! Работает как шарм. Можете ли вы сказать мне, почему именно мне нужно сбросить обработчики сигналов? Я думаю, что это то, чего я пропустил в своем подходе с pcntl_signal вместе с 'ticks = 1' ... – TiMESPLiNTER
Не знаю, выполняет ли сброс обработчики сигналов. Я поместил их там по привычке, это хорошая практика кодирования, чтобы закрыть открытые файлы, разрушить построенные объекты, освободить выделенные ресурсы a.s.o. Если вы не хотите 'exit()' немедленно, но хотите выполнить дополнительную обработку, рекомендуется установить флаг в обработчике сигнала и проверить его в главном программном цикле и продолжить соответственно (или использовать 'pcntl_signal_dispatch()' вместо 'declare (ticks = 1)'. Вы можете узнать больше о [сигналах окончания] (http://www.gnu.org/software/libc/manual/html_node/Termination-Signals.html). – axiac
Thx снова для ответа и интересная ссылка.Так что, если мне нравится использовать 'pcntl_signal_dispatch' вместо' ticks = 1', где я должен его называть? Где-то в моем цикле? Тогда скрипты выполняются до отправляемого вызова, который я предполагаю, а затем вызывает обратный вызов, определяемый функцией 'pcntl_signal'. right? – TiMESPLiNTER