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

Victor Sudakov vas на sibptus.ru
Пт Апр 16 07:27:53 UTC 2021


Evgeniy Berdnikov wrote:
> On Fri, Apr 16, 2021 at 12:54:21PM +0700, Victor Sudakov wrote:
> > А если php-скрипт ничего не возвращает клиенту, а делает sleep(100500)
> > внутри себя, и при этом nginx закрывает соединение со скриптом,
> > connection-status в скрипте не перейдет в состояние ABORTED?
> 
>  В скрипте (пользовательском процессе с php) не существует connection-status.

А в https://www.php.net/manual/en/features.connection-handling.php
написано что существует.
 
>  Статус коннекции есть в ядре, и для закрытой с одной стороны коннекции
>  он будет "half closed", т.е. на стороне получателя FINa перейдёт в
>  состояние CLOSE_WAIT. Смотрите диаграмму состояний TCP в RFC 793.

Это в данном случае не важно. Я говорю о connection status, который
доступен в PHP, на уровне приложения, по ссылке выше.

> 
> > Предположим что nginx закрывает TCP-соединение с апстримом штатно (FIN
> > -> FIN+ACK -> ACK). Или оно вообще было через Unix-socket. Таки
> > connection-status в скрипте всё равно останется NORMAL до попытки
> > вернуть клиенту какие-то данные?
> 
>  Повторю: состояние коннекции находится в ядре. Есть интерфейс общения
>  процесса и ядра. Если процесс попытается написать в сокет, для которого
>  другая сторона закрыла коннекцию, то ему ядро вернёт ECONNRESET.

Понятно что php откуда-то узнаёт информацию о состоянии соединения, но с
точки зрения php 

there are 4 possible states:

0 - NORMAL
1 - ABORTED
2 - TIMEOUT
3 - ABORTED and TIMEOUT

When a PHP script is running normally, the NORMAL state is active. 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. 

Вот PHP эти состояния переключает на основе какой-то информации, скорее
всего действительно от ядра. Когда состояние становится ABORTED, скрипт
должен по идее завершиться.

В документации написано, что когда "remote user hits his STOP button,
the next time your script tries to output something PHP will detect that
the connection has been aborted and the shutdown function is called."

Из этого можно заключить, что если не пытаться что-то из скрипта
выводить, то ABORTED никогда не наступит. Это верное утверждение?

>  Для мониторинга состояния коннекции есть poll/epoll/kqueue/etc, как уже
>  писали в этом треде. Но делать такой мониторинг непросто: нужно ловить
>  событие "коннекция закрыта с той стороны" и писать его обработчик,

Диаграмма состояний TCP и прочие его тонкости в контексте данной
беседы без надобности.  Можно вообще оговорить, что FastCGI через
Unix socket работает, суть вопроса не изменится.

>  возможно искать способы безопасного прерывания кода, работающего 3 часа.

Для этого уже предусмотрели  shutdown function, насколько я понимаю.

Вопрос не в этом, а в реакции php-fpm на нажатие пользователем кнопки
Стоп в браузере - в какой момент это нажатие отразится  в состояние
ABORTED в скрипте?

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


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