2009-09-15 4 views
10

PHP скрипты могут continue executing after the HTTP page request, так как я, наконец, остановить его выполнение, когда я закончил с ним?Может ли сценарий PHP прервать себя или обнаружить аборты?

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

ответ

5

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

+0

Имейте в виду, что обратный вызов выключения будет вызван, только если выполнение сценария завершено. Если пользователь прерывает соединение, это не вызвано. –

8

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

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

Вы также можете посмотреть информацию Connection handling. Где у нас есть такие вещи, как connection_aborted() и connection_status()

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

1

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

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

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

2

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

4

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

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

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

pcntl_signal(SIGTERM, "my_abort_handler");