Может ли закрытие браузера завершать PHP скрипт на сервере? - программирование
Подтвердить что ты не робот

Может ли закрытие браузера завершать PHP скрипт на сервере?

Скажите пользователю, нажав кнопку, в результате чего на мой сервер отправлен запрос jQuery ajax.

Сервер начинает сложный процесс в ответ на запрос ajax. Допустим, что для завершения процесса требуется 5 минут.

Тем временем пользователю становится скучно и закрывает окно своего браузера.

Будет ли script на сервере продолжать обработку до тех пор, пока он не завершится в основное время или не остановится?

То же самое, если пользователь посещает URL-адрес, например example.com/process.php?data=xxx. Это запустит process.php, который начнет обрабатывать данные и займет 5 минут для завершения обработки.

Будет ли эта обработка продолжаться, или если пользователь закрывает браузер, остановится ли она?

(Я спрашиваю, потому что меня беспокоит, что процесс оставлен наполовину законченным и приводит к поврежденным данным).

4b9b3361

Ответ 1

PHP не заметит, что браузер закрыл соединение, если оно не пытается вывести что-либо (например, echo). Если он ничего не выдает, script будет завершен, если ignore_user_abort не включен.

Таким образом, script завершается, только если выполняются следующие условия:

  • script пытается вывести что-то (потому что script не заметит, что пользователь прервал соединение до тех пор)
  • И php ignore_user_abort настройка выключена (если параметр выключен, php завершит script, если не выдает что-то)

Вы можете избежать script от завершения, включив ignore_user_abort.

Вы можете использовать connection_aborted() в любое время, чтобы проверить, был ли браузер отменен запрос.

A script может неожиданно прекратиться по другим причинам (например, максимальное время выполнения, исключение и т.д.); поэтому вы должны использовать транзакции, так что половину готовых изменений будут отменены, если script завершится ненормально.

Ответ 3

Поведение PHP по умолчанию заключается в том, что ваш script будет прерван, когда удаленный клиент отключит, обычно вызванный закрытием браузера или нажатием кнопки остановки. Это также может произойти, когда кто-то закрывает удаленное соединение с запуском script в режиме CLI. Единственное исключение для вашего прерывания script - это если вы зарегистрировали функцию выключения с помощью register_shutdown_function(). Подробное объяснение можно найти на странице Обработка подключения в документах PHP.

Точка, в которой фактически завершается script, зависит от того, когда вызывается flush(), который по существу пытается вытолкнуть текущий вывод полностью на браузер/клиент. В этом случае, если состояние соединения ABORTED, то script завершится, если мы не будем игнорировать прерывание пользователя.

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

Ответ 4

Если он не запущен как фоновый процесс, то есть с помощью и в конце... он просто завершится.

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