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

Я установил несколько версий 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, но по неизвестной причине это абсолютно не влияет на мою систему.


person astax    schedule 21.10.2016    source источник


Ответы (1)


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

Потратив на это довольно много времени, я понял, что виновником было использование FcgidCmdOptions в конфигурации виртуального хоста. Если он определен, глобальные параметры 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>
person astax    schedule 21.10.2016