Скажем, пользователь нажал кнопку, в результате чего на мой сервер был отправлен запрос jQuery ajax.
Сервер начинает сложный процесс в ответ на запрос ajax. Допустим, что процесс занимает 5 минут.
Тем временем пользователю становится скучно и закрывает окно своего браузера.
Будет ли скрипт на сервере продолжать обработку до тех пор, пока он не завершится в основное время или не остановится?
То же самое, если пользователь посещает URL-адрес, например example.com/process.php?data=xxx. Это запустит process.php, который начнет обрабатывать данные и займет 5 минут для завершения обработки.
Будет ли эта обработка продолжаться, или если пользователь закрывает браузер, остановится ли она?
(Я спрашиваю, потому что я обеспокоен тем, что процесс оставлен наполовину законченным и приводит к поврежденным данным).
PHP не заметил, что браузер закрыл соединение, если он не пытается вывести что-то (например, echo). Если ему не удается что-то вывести, сценарий будет завершен, если ignore_user_abort
не ignore_user_abort
.
Таким образом, скрипт завершится, только если выполняются следующие условия:
ignore_user_abort
php отключен (если параметр выключен, php завершает сценарий, если не выводит что-то) Вы можете избежать завершения сценария, включив ignore_user_abort
.
Вы можете использовать connection_aborted()
в любое время, чтобы проверить, был ли браузер отменен запрос.
Сценарий может неожиданно прекратиться по другим причинам (например, максимальное время выполнения, исключение и т. Д.); поэтому вы должны использовать транзакции, чтобы половину готовых изменений отменяли, если скрипт прерывается ненормально.
См. http://php.net/manual/en/function.ignore-user-abort.php . Это зависит от параметра ignore_user_abort и нескольких других условий.
Поведение PHP по умолчанию заключается в том, что ваш скрипт будет прерван, когда удаленный клиент отключится , как правило, вызванный закрытием браузера или нажатием кнопки остановки. Это также может произойти, когда кто-то закрывает удаленное соединение с сценарием, запущенным в режиме CLI. Единственное исключение для прерывания вашего сценария – это если вы зарегистрировали функцию выключения с помощью register_shutdown_function()
. Подробное объяснение см. На странице « Управление подключением» в документах PHP.
Точка, в которой сценарий фактически заканчивается, зависит от того, когда вызывается flush()
, который по существу пытается вытолкнуть текущий вывод полностью на браузер / клиент. В этот момент, если состояние соединения ABORTED
сценарий завершится, если мы не будем игнорировать прерывание пользователя.
Важно отметить, что вы можете контролировать, происходит ли это поведение или нет , поскольку вы иногда указываете, что это нежелательно для этого. Использование функции ignore_user_abort()
или установка соответствующей директивы в php.ini.
Если он не запущен как фоновый процесс, то есть с & в конце … он просто закончится.
Закрытие браузера немного больше для него … В конце концов это остановится, но немного обработает, пока веб-сервер не поймет, что соединение ушло.