Подтвердить что ты не робот

Выполняется ли выполнение php после того, как пользователь покидает страницу?

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

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

4b9b3361

Ответ 1

Это зависит.

Из http://us3.php.net/manual/en/features.connection-handling.php:

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

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

Казалось бы, ответ на ваш вопрос: "Да, script завершится, если пользователь покинет страницу".

Однако поймите, что в зависимости от используемого бэкэнд SAPI (например, mod_php) php не может обнаружить, что клиент прервал соединение до тех пор, пока попытка не будет чтобы отправить информацию клиенту. Если ваш длинный script не выдает flush(), script может продолжать работать, даже если пользователь закрыл соединение.

Усложнение вещей даже при периодических вызовах flush(), если

Ответ 2

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

Ответ 3

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

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

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

Ответ 4

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