Может ли PHP скрипт прервать себя или обнаружить аборты?
PHP-скрипты могут продолжать выполнение после запроса HTTP-страницы, так как я могу, наконец, остановить его выполнение, когда я закончил с ним?
Кроме того, есть ли событие для обнаружения, когда ОС будет принудительно отменять script? или как сохранить внутренний таймер для прогнозирования max_execution_time
?
Ответы
Ответ 1
Вы можете использовать register_shutdown_function
для регистрации функции, которая будет вызываться в конце выполнения script. Вы можете использовать это, чтобы определить, когда script был завершен и выполнить определенный набор действий.
Ответ 2
exit()/die() остановит php script.
Чтобы узнать, когда остановить script, вам просто нужно будет использовать microtime в качестве таймера и сохранить как константа (или выборка из файла php.ini) максимальное время выполнения.
Вы также можете посмотреть Информация о подключении. Где у нас есть такие вещи, как connection_aborted() и connection_status()
Но в чем проблема, которую вы пытаетесь решить?
Ответ 3
Чтобы иметь обратный вызов в момент закрытия вашего запроса, используйте register_shutdown_function( myfunction )
.
Как и в большинстве сред POSIX, PHP также поддерживает обработчики сигналов. Вы можете зарегистрировать свой собственный обработчик для события SIGTERM
.
function my_abort_handler( $signo ) {
echo "Aborted";
}
pcntl_signal( SIGTERM, "my_abort_handler" );
Ответ 4
Вы можете взглянуть на pcntl-alarm, который позволяет script отправлять сигнал самому себе. Также содержит пример того, как поймать сигналы kill, которые могут быть отправлены ОС. И умереть() действительно.
Ответ 5
Ну, вы можете запустить $start=microtime(true)
, который вернет метку времени. Затем вы можете просто проверить microtime(true)
и вычесть это из вашего времени начала, чтобы получить количество секунд с момента выполнения.
Но нет, вы не можете "поймать" script как его завершение по причине слишком долгого запроса. Вы можете попытаться сделать некоторые вещи в последнюю минуту в обработчике выключения, но я не уверен, что PHP это почитает.
Похоже, что раньше была функция, которая делает именно то, что вы хотите, connection_timeout(), но она устарела и удалена. Однако не знаю, есть ли какая-либо замена для этого.