Может ли 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(), но она устарела и удалена. Однако не знаю, есть ли какая-либо замена для этого.