Валентин Бартенев Wrote:
-------------------------------------------------------
> On Monday 17 February 2014 13:21:03 S.A.N wrote:
> [..]
> > Если я правильно понял, использовать keepalive конекта после
> > FCGI_END_REQUEST, не выйдет?
> > И есть только два варианта, отказаться от keepalive (без него эта
> схема
> > работает) или отказаться от fastcgi_finish_request (без него
> работает
> > keepalive)
> >
>
> Есть только один правильный вариант реализации выполнения тяжелых
> запросов:
> складывать их в очередь, которую затем разгребать отдельным процессом.
Я согласен, так стоит делать если операции не связаны с текущем состоянием процесса и не срочны для выполнения, тогда конечно их можно и нужно выполнять позже в отдельных процессах.
После fastcgi_finish_request() мы выполняем обновления кеша (если надо), который срочно будет нужен следующим запросам, обновления сессии юзера (если надо), в общем все эти работы привязаны к текущему состоянию процесса и должны выполнятся срочно.
Но юзер не должен ждать завершения их выполнения, он уже может получить готовый ответ, по этому все эти работы выполняются после fastcgi_finish_request()
> От того, что вы позвали fastcgi_finish_request() - у вас самый главный
> ресурс,
> PHP-процесс не освободился и обрабатывать другие запросы он
> по-прежнему не
> в состоянии.
PHP-FPM, создаст новый процесс, если запрос придет в новом конекте.
Но если юзать keepalive и новый запрос использует уже открытый конект с РНР процессом который работает в фоне, будет очередь ожидания и потом вылетит 502 ошибка, появления очереди логично, вот ошибка 502 это страно, по идеи запрос должен выполнятся нормально когда освободится процесс.
Пока что keepalive мы убрали, конекты плодятся РНР воркере тоже плодятся, все работает без очередей и ожиданий, но потеряли возможность повторного использования конектов (keepalive), потеря не велика конечно, но все же интересно можно эту схему реализовать на keepalive FastCGI