2009-08-14 3 views
37

Я хочу запустить относительно длительный скрипт, основанный на некотором входе формы, но я бы предпочел не прибегать к cron, поэтому мне интересно, будет ли запрошена PHP-страница через ajax до завершения или если она остановится если пользователь покидает страницу.Выполняет ли выполнение php после того, как пользователь покидает страницу?

На самом деле он не выводится в браузер до json_encode в конце файла, так что все до того, как это будет выполнено?

ответ

67

Это зависит.

От http://us3.php.net/manual/en/features.connection-handling.php:

Когда PHP скрипт работает нормально нормальное состояние, является активным. Если удаленный клиент отключает флаг состояния ABORTED , он включается. Удаленный клиентский разъединение обычно вызван пользователем, нажав кнопку STOP.

Вы можете решить, хотите ли вы отключить клиентское соединение , чтобы ваш сценарий был прерван. Иногда бывает , чтобы всегда иметь ваши сценарии для запуска до завершения, даже если нет удаленный браузер, получающий выход. Поведение по умолчанию, однако, для вашего сценария будет отменено, когда удаленный клиент отключится. Это поведения может быть установлено с помощью php.ini директивы по ignore_user_abort, как также через соответствующую директиву httpd.conf php_value ignore_user_abort Apache или с функцией ignore_user_abort().

Это, похоже, ответ на ваш вопрос: «Да, сценарий завершится, если пользователь покинет страницу».

Однако осознайте, что в зависимости от используемого бэкэнд SAPI (например, mod_php), php cannot detect that the client has aborted the connection until an attempt is made to send information to the client. Если ваш длинный скрипт не выдаст flush(), скрипт может продолжать работать, даже если пользователь закрыл соединение.

усложнять даже если вы сделать выпуск периодических вызовов flush(), имея output buffering на причинит эти вызовы в ловушку и не отправляет их клиенту, пока скрипт не завершится в любом случае!

Далее усложнять, если вы установили Apache обработчики, буферные ответ (например, mod_gzip), а затем еще раз PHP не обнаружит, что соединение закрывается и сценарий будет держать на грузоперевозки.

Фуэ.

+5

очень подробно +1 –

6

Это зависит от ваших настроек - обычно он останавливается, но вы можете использовать ignore_user_abort(), чтобы оно продолжалось.

+5

Там большое предупреждение жира в http://www.php.net/manual/en/function.ignore-user-abort.php, что 'ignore_user_abort()' не гарантируется, если работы данные не может быть отправлено клиенту, что может произойти в нескольких сценариях. См. Мой ответ. –

1

В зависимости от конфигурации веб-сервера и/или PHP процесс PHP может или не может убить поток, когда пользователь завершает соединение HTTP. Если запрос AJAX находится на рассмотрении, когда пользователь уходит от страницы, это зависит от того, как браузер убил запрос (не гарантируется) ontop вашего сервера (не гарантируется). Не тот ответ, который вы хотите услышать!

Я бы рекомендовал создать рабочую очередь в плоском файле или базе данных, чтобы постоянно работающий PHP daemon мог опросить работу. Он не страдает от задержки cron, но сохраняет использование ЦП/памяти на полезном уровне. По завершении задания поместите результаты в плоский файл/базу данных для извлечения AJAX. Или обещайте отправить сообщение по электронной почте пользователю после завершения задания (мой предпочтительный метод).

Надеюсь, что поможет

0

Если клиент/пользователь/загрузчик/просмотрщик прерывается или отключается, сценарий будет продолжать работать, пока что-то не попытается очистить новые данные от клиента. Если вы не использовали ignore_user_abort(), сценарий там погибнет. В том же порядке PHP не может определить, существует ли клиент, не пытаясь очистить данные до httpd.

Смежные вопросы