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


Допустим, пользователь нажал кнопку, в результате чего на мой сервер был отправлен запрос jquery ajax.

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

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

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

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

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

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

Author: Praveen Kumar Purushothaman, 2012-07-06

4 answers

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

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

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

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

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

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

 18
Author: arnaud576875, 2012-07-06 10:24:41

См.: http://php.net/manual/en/function.ignore-user-abort.php . Это зависит от параметра ignore_user_abort и нескольких других условий.

 3
Author: D-Rock, 2012-07-06 10:21:24

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

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

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

 1
Author: GordyD, 2012-07-06 11:19:34

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

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

 -1
Author: Brian, 2012-07-06 10:17:50