@bighoc
php/javascript developer

Продолжит ли работать скрипт php если клиент закрыл бразуер ?

Пусть при переходе по url url.ru/action на сервере запускается скрипт который выполняется 5 минут.
Клиент запрашивает урл url.ru/action , ждём две минуты и закрывает браузер.
Закончит ли скрипт свою работу ?
Или остановится вместе с закрытием бразуера?
  • Вопрос задан
  • 2490 просмотров
Пригласить эксперта
Ответы на вопрос 2
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
любой вывод данных - приведет к ошибке.
если скрипт без вывода (или вывод совсем в конце) - он отработает целиком.
проверку доступности сокета скрипт делает ТОЛЬКО в момент отдачи данных в сокет.
Ответ написан
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Вы можете оборвать запрос со стороны сервера, сказав клиенту что мол данных от вас больше не поступит и соединение можно закрывать. А скрипт после этого продолжит работать и может делать какие-нибудь тяжелые задачи. К сожалению это умеет только php-fpm.

php.net/manual/ru/function.fastcgi-finish-request.php

Эту функцию использует Symfony/HttpFoundation при отправке запроса. Сам же Symfony из коробки отправляет почту к примеру только после этого, так что время отправки сообщений пользователю не влияют на время запроса между клиентом и сервером.

Если же вам нужно как-то отследить что пользователь закрыл TCP сессию (закрыл вкладку, ребутнул комп или просто нажал "стоп"), то PHP об этом узнает, как и сказал xmoonlight, только при попытке записи (по flush). Что бы все было лучше можно делать проверку используя функцию connection_aborted().

Так же есть особенности работы web-server-а. Скажем nginx будет держать соединение сколько вы того пожилаете. А вот apache убьет соединение через минуту вне зависимости от настроек PHP (могу ошибаться, давно не имел дела с апачем).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы