Может ли скрипт PHP прервать сам себя или обнаружить аборт? - PullRequest
10 голосов
/ 15 сентября 2009

PHP-скрипты могут продолжать выполняться после запроса страницы HTTP , так как же мне, наконец, остановить его выполнение, когда я закончу с ним?

Кроме того, существует ли событие, чтобы определить, когда ОС собирается принудительно прервать выполнение сценария? или как мне сохранить внутренний таймер для прогнозирования max_execution_time?

Ответы [ 5 ]

8 голосов
/ 15 сентября 2009

exit () / die () остановит скрипт php.

Чтобы узнать, когда остановить скрипт, вам просто нужно использовать microtime в качестве таймера и сохранить в качестве константы (или извлечь из файла php.ini) максимальное время выполнения. *

Вы также можете ознакомиться с информацией Обработка соединений . Где у нас есть такие вещи, как connection_aborted () и connection_status ()

Но какую проблему вы пытаетесь решить?

5 голосов
/ 15 сентября 2009

Вы можете использовать register_shutdown_function для регистрации функции, которая будет вызвана в конце выполнения скрипта. Вы можете использовать это, чтобы определить, когда сценарий был завершен, и выполнить определенный набор действий.

4 голосов
/ 15 сентября 2009

Чтобы получить обратный вызов в момент закрытия вашего запроса, используйте register_shutdown_function( myfunction ).

Подобно большинству сред POSIX, PHP также поддерживает обработчики сигналов . Вы можете зарегистрировать свой собственный обработчик для события SIGTERM.

function my_abort_handler( $signo ) {
   echo "Aborted";
}

pcntl_signal( SIGTERM, "my_abort_handler" );
2 голосов
/ 15 сентября 2009

Возможно, вы захотите взглянуть на pcntl-alarm , который позволяет сценарию отправлять сигнал самому себе. Также содержит пример того, как отлавливать сигналы уничтожения, которые могут быть отправлены ОС. И умереть () действительно.

1 голос
/ 15 сентября 2009

Ну, вы можете запустить $start=microtime(true), который будет возвращать метку времени. Затем вы можете просто продолжать проверять microtime(true) и вычитать это из вашего начального времени, чтобы получить количество секунд с момента выполнения.

Но нет, вы не можете «поймать» скрипт как его завершающий, потому что запрос слишком длинный. Вы можете попытаться сделать что-нибудь в последнюю минуту в обработчике завершения работы, но я не уверен, что PHP выполнит это.

Похоже, раньше была функция, которая делает именно то, что вы хотите, connection_timeout () , но она устарела и удалена. Однако не знаю, есть ли какая-нибудь замена для этого.

...