Re: Тонкости работы FastCGI (phpfpm)
Maxim Dounin
mdounin на mdounin.ru
Чт Апр 15 14:20:48 UTC 2021
Hello!
On Thu, Apr 15, 2021 at 12:02:31PM +0700, Victor Sudakov wrote:
> Maxim Dounin wrote:
> >
> > On Tue, Apr 13, 2021 at 02:52:00PM +0700, Victor Sudakov wrote:
> >
> > > Aleksandr Sytar wrote:
> > > >
> > > > > Что должно
> > > > > произойти, когда пользователь отменил HTTP запрос, или браузер закрыл?
> > > > > nginx закроет соответствующее соединение с php-fpm ? А PHP-код продолжит
> > > > > работу? Или должен прерваться?
> > > > >
> > > > > Прошу прощения за сумбурное изложение, поправки и указания на неверное
> > > > > понимание логики работы с благодарностью принимаются.
> > > > >
> > > > >
> > > > >
> > > > Раз - https://habr.com/ru/post/179399/
> > > > Двас - https://www.php.net/manual/ru/function.fastcgi-finish-request.php и
> > > > крути себе дальше в базе что надо.
> > >
> > > Я наверное плохо сформулировал вопрос, но мне как раз интересно видеть
> > > обратное поведение. Закрыли браузер - обслуживавший этот сеанс процесс
> > > PHP завершился, что бы ни делал в этот момент.
> > >
> > > А в приведенных ссылках обратную задачу пытаются решить.
> >
> > Прямая задача, как я понимаю, нормально решается только в случае,
> > если php-скрипт что-то возвращает клиенту, подробнее тут:
> >
> > https://www.php.net/manual/en/features.connection-handling.php
>
> Спасибо, Maxim, очень полезная ссылка. Я в первом письме так и
> предполагал, как должно происходить (см. последнюю строчку цитаты):
>
> "If the remote client disconnects, the ABORTED state flag is turned on.
> A remote client disconnect is usually caused by users hitting their STOP
> button. [...] You can decide whether or not you want a client disconnect
> to cause your script to be aborted. Sometimes it is handy to always have
> your scripts run to completion even if there is no remote browser
> receiving the output. The default behaviour is however for your script
> to be aborted when the remote client disconnects. "
>
> Другой вопрос, почему в наблюдаемом мной случае это не происходило.
> Пойду посмотрю код, может там действительно какой-нибудь
> ignore_user_abort стоит. В php.ini уже проверил,
> ignore_user_abort => Off => Off
Отмечу ещё раз, что всё это работает только в том случае, если
php-скрипт что-то возвращает клиенту, и даже в этом случае нужны
приседания. Об этом, в частности, рассказывается в комментариях к
описанию connection_aborted(). То есть исходная задача "скрипт
ждёт ответа базы 3 часа" - в php просто так не решается.
--
Maxim Dounin
http://mdounin.ru/
Подробная информация о списке рассылки nginx-ru