mod_fcgid время ожидания чтения из канала, конец вывода скрипта перед заголовками, несколько версий PHP

#php #apache #mod-fastcgi

#php #apache #мод-fastcgi

Вопрос:

Я настроил несколько версий PHP под Apache в Windows, используя mod_fcgid. Конфигурация такая:

 LoadModule fcgid_module modules/mod_fcgid.so

FcgidInitialEnv SystemRoot "C:/Windows"
FcgidInitialEnv SystemDrive "C:"
FcgidInitialEnv TEMP "c:/php/tmp"
FcgidInitialEnv TMP "c:/php/tmp"
FcgidInitialEnv windir "C:/WINDOWS"
FcgidIOTimeout 600
FcgidConnectTimeout 600
FcgidProcessLifeTime 3600
FcgidMaxRequestsPerProcess 900 
FcgidMaxProcesses 10
FcgidMaxRequestLen 80131072
FcgidInitialEnv PHP_FCGI_MAX_REQUESTS 1000
  

И затем определенный обработчик fcgi в каждой директиве vhost:

 <Virtualhost *:80>
    VirtualDocumentRoot "e:/hosts/example"
    ServerName example.local
    # location of php.ini
    FcgidCmdOptions c:/php/php5.5.12/php-cgi.exe InitialEnv PHPRC="c:/php/php5.5.12/"
    FcgidWrapper "c:/php/php5.5.12/php-cgi.exe" .php
</Virtualhost>

<Virtualhost *:81>
    VirtualDocumentRoot "e:/hosts/example"
    ServerName example.local
    # location of php.ini
    FcgidCmdOptions c:/php/php7.0.12/php-cgi.exe InitialEnv PHPRC="c:/php/php5.5.12/"
    FcgidWrapper "c:/php/php7.0.12/php-cgi.exe" .php
</Virtualhost>
  

Таким образом http://example.local / работает с PHP 5.5, но http://example.local:81 / обслуживает один и тот же код, но с PHP 7.0. Очень удобно для тестирования нескольких версий PHP в одной системе.

Но я продолжаю получать тайм-ауты fcgi примерно через 40-60 секунд, что мешает мне эффективно использовать xdebug.

Я проверил ряд похожих вопросов по SO, большинство из которых корректно предлагают установить более высокое значение FcgidIOTimeout параметра, но по неизвестной причине это абсолютно не влияет на мою систему.

Ответ №1:

Я отвечаю на свой собственный вопрос, надеясь, что это сэкономит кому-то часы борьбы с этой проблемой.

Потратив на это довольно много времени, я понял, что виновник был в использовании FcgidCmdOptions в конфигурации vhost. Если это определено, глобальные параметры fcgid просто игнорируются! Итак, вместо настройки FcgidIOTimeout мне пришлось установить IOTimeout опцию в FcgidCmdOptions .

Окончательная конфигурация следующая:

 <Virtualhost *:80>
    VirtualDocumentRoot "e:/hosts/example"
    ServerName example.local
    FcgidCmdOptions c:php/php5.5.12/php-cgi.exe 
            InitialEnv PHPRC="c:php/php5.5.12/" 
            InitialEnv PHP_FCGI_MAX_REQUESTS=1000 
            IOTimeout 3600 
            ConnectTimeout 3600 
            MaxProcessLifeTime 7200 
            IdleTimeout 3600 
            MaxRequestsPerProcess 900
    FcgidWrapper "c:php/php5.5.12/php-cgi.exe" .php
</Virtualhost>

<Virtualhost *:81>
    VirtualDocumentRoot "e:/hosts/example"
    ServerName example.local
    FcgidCmdOptions c:php/php7.0.12/php7-cgi.exe
            InitialEnv PHPRC="c:php/php7.0.12/" 
            InitialEnv PHP_FCGI_MAX_REQUESTS=1000 
            IOTimeout 3600 
            ConnectTimeout 3600 
            MaxProcessLifeTime 7200 
            IdleTimeout 3600 
            MaxRequestsPerProcess 900
    FcgidWrapper "c:php/php7.0.12/php7-cgi.exe" .php
</Virtualhost>