Intereting Posts
PHP Передача объекта через класс? Проводка с локального веб-сайта html / javascript в онлайн-файл PHP Продолжайте получать «Ежедневный лимит неисполненного использования превышен. Продолжение использования требует регистрации "при попытке Google плюс вход в мое веб-приложение Php: Предупреждение: заголовок может содержать не более одного заголовка, а новая строка обнаружена в Как скрыть расширение .html с URL-адреса веб-сайта Firebase создает пользователя вручную, Ошибка соединения PDO при использовании symfony и MAMP Могу ли я создать приложение exe для Windows с помощью PHP-программы и с помощью базы данных? Заменить все вхождения char внутри кавычек на PHP Отправить данные POST на PHP без использования HTML-формы? Накладки на Google Карты Создание глобальной переменной, доступной для каждой функции внутри класса Назначение массива php в массив javascript как сделать слайдер изображения во время цикла Создание страницы ошибки для субдомена, который не существует

Выполняется ли выполнение php после того, как пользователь покидает страницу?

Я хочу запустить относительно длительный скрипт на основе ввода какой-либо формы, но я бы предпочел не прибегать к cron, поэтому мне интересно, будет ли запрашиваемая php-страница через ajax продолжать выполнять до завершения или если она будет остановлена, если пользователь покидает страницу.

На самом деле он не выводится в браузер до json_encode в конце файла, так что все до того, как это будет выполнено?

Solutions Collecting From Web of "Выполняется ли выполнение php после того, как пользователь покидает страницу?"

Это зависит.

С http://us3.php.net/manual/en/features.connection-handling.php :

Когда PHP-скрипт работает нормально, состояние NORMAL является активным. Если удаленный клиент отключает флаг состояния ABORTED, он включается. Отключение удаленного клиента обычно вызвано тем, что пользователь нажал кнопку STOP.

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

Казалось бы, ответ на ваш вопрос: «Да, сценарий прекратится, если пользователь покинет страницу».

Однако поймите, что в зависимости от используемого бэкэнда SAPI (например, mod_php ) php не может обнаружить, что клиент прервал соединение до тех пор, пока не будет предпринята попытка отправить информацию клиенту . Если ваш длинный сценарий не выдает flush() скрипт может продолжать работать, даже если пользователь закрыл соединение.

Усложнение вещей даже в том случае, если вы периодически выдаете периодические вызовы flush() , при буферизации вывода которых эти вызовы будут ловутся и не будут отправлять их клиенту до тех пор, пока скрипт не завершится в любом случае!

Дальнейшее усложнение ситуации заключается в том, что вы установили обработчики Apache, которые буферизуют ответ (например, mod_gzip ), а затем php не обнаружит, что соединение закрыто, и скрипт будет продолжать работать на грузовиках.

Уф.

Это зависит от ваших настроек – обычно он останавливается, но вы можете использовать ignore_user_abort() чтобы оно продолжалось.

В зависимости от конфигурации веб-сервера и / или PHP, процесс PHP может или не может убить поток, когда пользователь завершает соединение HTTP. Если запрос AJAX находится на рассмотрении, когда пользователь уходит от страницы, это зависит от того, как браузер уничтожает запрос (не гарантируется) на вашем сервере (не гарантируется). Не тот ответ, который вы хотите услышать!

Я бы рекомендовал создать рабочую очередь в плоском файле или базе данных, чтобы постоянно работающий демон PHP мог опросить работу. Он не страдает задержкой cron но сохраняет использование CPU / памяти на полезном уровне. По завершении задания поместите результаты в плоский файл / базу данных для извлечения AJAX. Или обещайте отправить сообщение по электронной почте пользователю после завершения задания (мой предпочтительный метод).

надеюсь, это поможет

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

нашел фактическое решение для моего случая, когда он не прекратил соединение. Сессия на моем сервере Apache / Php должна была закрыться до следующего запуска.

Браузер ждет завершения ajax-вызова после отмены.