#php #jquery #ajax #laravel #xampp
#php #веб-сервер
Вопрос:
Допустим, пользователь нажал кнопку, в результате чего на мой сервер был отправлен запрос jquery ajax.
Сервер начинает сложный процесс в ответ на запрос ajax. Допустим, для завершения этого процесса требуется 5 минут.
Тем временем пользователю становится скучно и он закрывает окно своего браузера.
Продолжит ли скрипт на сервере свою обработку до тех пор, пока не завершится в обычное время, или он остановится?
То же самое, если пользователь посещает URL-адрес, например example.com/process.php?data=xxx . Это начинается process.php который начинает обрабатывать данные, и для завершения обработки потребуется 5 минут.
Будет ли эта обработка всегда продолжаться или, если пользователь закроет браузер, она остановится?
(Я спрашиваю, потому что я обеспокоен тем, что процесс остается незавершенным и приводит к повреждению данных).
Комментарии:
1. прервать HttpRequest в window.onbeforeunload ?
2. хороший вопрос 92-летней давности !! : P
Ответ №1:
PHP не заметит, что браузер закрыл соединение, если он не попытается что-то вывести (например, echo). Если ему не удастся что-то вывести, скрипт будет завершен, если ignore_user_abort
не включен.
Таким образом, скрипт завершится, только если будут выполнены следующие условия:
- скрипт пытается что-то вывести (потому что скрипт не заметит, что пользователь прервал соединение до тех пор)
- И
ignore_user_abort
параметр php выключен (если параметр выключен, php завершит работу скрипта, если не удастся что-то вывести)
Вы можете избежать завершения работы скрипта, включив ignore_user_abort
.
Вы можете использовать connection_aborted()
в любое время, чтобы проверить, не прервал ли браузер запрос.
Сценарий может неожиданно завершиться по другим причинам (например, максимальное время выполнения, исключение и т. Д.); Поэтому вам следует использовать транзакции, Чтобы незавершенные изменения отменялись, если сценарий завершается ненормально.
Комментарии:
1. Вы имеете в виду, если возникают оба условия или если возникает какое-либо из них?
2.
PHP will not detect that the user has aborted the connection until an attempt is made to send information to the client. Simply using an echo statement does not guarantee that information is sent, see flush().
Похоже, вы правы. Имеет ли значение, какой веб-сервер используется, т.Е. Apache, IIS, или все они работают одинаково, когда дело доходит до этого?3. Могут быть незначительные различия
4. Я думаю, как быстро обнаруживается прерывание и т. Д.; Вы должны проверить себя
Ответ №2:
Смотрите: http://php.net/manual/en/function.ignore-user-abort.php . Это зависит от параметра ignore_user_abort и нескольких других условий.
Ответ №3:
Поведение по умолчанию для PHP заключается в том, что ваш скрипт будет прерван при отключении удаленного клиента, обычно вызванном закрытием пользователем своего браузера или нажатием кнопки остановки. Это также может произойти, когда кто-то закрывает удаленное соединение со скриптом, запущенным в режиме CLI. Единственное исключение для прерывания вашего скрипта — это если вы зарегистрировали функцию завершения работы с помощью register_shutdown_function()
. Подробное объяснение см. На странице Обработки соединений в PHP docs.
Точка, в которой скрипт фактически завершается, зависит от того, когда flush()
вызывается, что, по сути, пытается передать текущий вывод вплоть до браузера / клиента. На этом этапе, если состояние соединения равно ABORTED
, скрипт завершится, если мы не игнорируем прерывание пользователя.
Важно отметить, что вы можете контролировать, происходит ли такое поведение или нет, поскольку вы указываете, что иногда это нежелательно, чтобы это происходило. Использование ignore_user_abort()
функции или установка соответствующей директивы в php.ini.
Комментарии:
1.
PHP will not detect that the user has aborted the connection until an attempt is made to send information to the client.
php.net/manual/en/function.ignore-user-abort.php
Ответ №4:
Если только он не запущен как фоновый процесс, т.Е. с amp; в конце… он просто завершится.
Закрытие браузера немного больше… В конечном итоге он остановится, но будет обрабатываться некоторое время, прежде чем веб-сервер поймет, что соединение пропало.
Комментарии:
1. Вы имеете в виду фоновый процесс браузера?
2. Этот ответ кажется вводящим в заблуждение и неполным.
3. Можете ли вы поделиться более подробной информацией? Как бы вы запустили такой «фоновый процесс» через браузер? О втором абзаце: есть ли какой-либо достоверный источник, что означает «остановка в конечном итоге»?