ignore_user_abort()
позволяет вашему сценарию (и Apache) игнорировать отключение пользователя (закрытие браузера / вкладки, удаление со страницы, нажатие ESC, esc ..) и продолжение обработки. Это полезно в некоторых случаях - например, в корзине покупок, когда пользователь нажимает кнопку «Да, разместите заказ». Вы действительно не хотите, чтобы заказ умер в середине процесса, например заказ находится в базе данных, но платеж еще не отправлен в платежную систему. Или наоборот.
Однако, несмотря на то, что этот скрипт уходит в фоновом режиме, он блокирует ресурсы на сервере, особенно файл сеанса - PHP блокирует файл сеанса, чтобы убедиться, что несколько параллельных запросов не будут растоптаны файла, поэтому, пока ваш бесконечный цикл работает в фоновом режиме, вы не сможете использовать другие части сайта с включенной сессией. И если цикл достаточно интенсивный, он может связать процессор настолько, что Apache не сможет обрабатывать любые другие запросы на других размещенных сайтах, где блокировка сеанса может не применяться.
Если это бесконечный цикл, вам придется подождать, пока собственное максимальное допустимое время выполнения PHP (set_time_limit()
и max_execution_time()
) включится и убьет скрипт , Есть также некоторые ограничители на стороне сервера, такие как Apache RLimitCPU
и TimeOut
, которые могут обрабатывать подобные ситуации.
Обратите внимание, что кроме Windows, PHP не считает "внешнее" время в set_time_limit. Поэтому, если ваш процесс запуска выполняется в базе данных, вызывая внешние программы с помощью system()
и т. П., Время, потраченное на выполнение этих внешних вызовов, НЕ учитывается в родительском ограничении времени.