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

Evgeniy Berdnikov bgx на protva.ru
Пт Апр 16 06:33:31 UTC 2021


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

 В скрипте (пользовательском процессе с php) не существует connection-status.
 Статус коннекции есть в ядре, и для закрытой с одной стороны коннекции
 он будет "half closed", т.е. на стороне получателя FINa перейдёт в
 состояние CLOSE_WAIT. Смотрите диаграмму состояний TCP в RFC 793.

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

 Повторю: состояние коннекции находится в ядре. Есть интерфейс общения
 процесса и ядра. Если процесс попытается написать в сокет, для которого
 другая сторона закрыла коннекцию, то ему ядро вернёт ECONNRESET.

> > Об этом, в частности, рассказывается в комментариях к 
> > описанию connection_aborted().  То есть исходная задача "скрипт 
> > ждёт ответа базы 3 часа" - в php просто так не решается.
> 
> Исходная как раз чтобы php-скрипт ничего не ждал и помирал побыстрее, если
> nginx соединение с ним закрыл. 

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


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