Intereting Posts
Один элемент викторины на страницу (программа тестирования php / mysql) PHP Неустранимая ошибка: допустимый размер памяти 33554432 байт исчерпан (пытался выделить 41007872 байта) Членство в WooCommerce: для просмотра доступа к странице используя php для загрузки файлов, не работая над большими файлами? Арабский язык в php / mysql появляется «????» вопросительные знаки в html OpenSSL HMAC-SHA1 дайджест не соответствует Crypto's Подтвердить json в php Инициатор IPN: «IPN не был отправлен, и рукопожатие не было проверено. Пожалуйста, просмотрите информацию " Интеграция Moodle с моим проектом PHP Отображение всех имен таблиц в php из базы данных MySQL mysql_num_rows дает ошибку "mysql_num_rows () ожидает, что параметр 1 будет ресурсом" PDO_SQLITE driver нет .. что делать? Я хочу обновить значение переключателя в базе данных (mysql), используя php base_url не работает в codeigniter 3.0.3 Передача переменных GET с использованием заголовка в PHP

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

Скажем, пользователь нажал кнопку, в результате чего на мой сервер был отправлен запрос 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.

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

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