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