Re: Тонкости работы FastCGI (phpfpm)

Victor Sudakov vas на sibptus.ru
Чт Апр 15 05:02:31 UTC 2021


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

> https://www.php.net/manual/en/function.ignore-user-abort.php
> https://www.php.net/manual/en/function.connection-aborted.php
> 
> Но я не настоящий сварщик, про php знаю мало.
> 
> > Антиоффтопик. nginx-то что делает в момент закрытия соединения
> > клиентским браузером: закрывает ли соответствущее соединение с fastcgi
> > upstream-ом?
> 
> В общем случае да.  И именно для того, чтобы бэкенд узнал о том, 
> что соединение закрыто клиентом и выполняемая работа больше не 
> нужна.

Так и предполагал.

>  Если этого по каким-то не требуется, то можно использовать 
> директиву fastcgi_ignore_client_abort:
> 
> http://nginx.org/r/fastcgi_ignore_client_abort
> 
> Кроме того, соединение не будет закрыто, если используется 
> кэширование или fastcgi_store, так как в этих случаях ответ 
> бэкенда полезен вне зависимости от того, будет ли он отправлен 
> конкретному клиенту.

А может и кэширование причиной. Но стало понятнее, куда копать, спасибо
еще раз.

-- 
Victor Sudakov VAS4-RIPE
http://vas.tomsk.ru/
2:5005/49 at fidonet


Подробная информация о списке рассылки nginx-ru