mod_fcgid从管道读取超时,在头之前结束脚本输出,PHP的多个版本

mod_fcgid从管道读取超时,在头之前结束脚本输出,PHP的多个版本,php,apache,mod-fastcgi,Php,Apache,Mod Fastcgi,我使用mod_fcgid在Windows上的Apache下设置了几个PHP版本。配置如下: 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 wi

我使用mod_fcgid在Windows上的Apache下设置了几个PHP版本。配置如下:

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
然后是每个vhost指令中的特定fcgi处理程序:

<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>

VirtualDocumentRoot“e:/hosts/example”
ServerName example.local
#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
VirtualDocumentRoot“e:/hosts/example”
ServerName example.local
#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
这种方法适用于PHP5.5,但提供与PHP7.0相同的代码。非常方便在同一系统上测试多个版本的PHP

但我在大约40-60秒后一直收到fcgi超时,这使我无法有效地使用xdebug


我已经在SO上检查了许多类似的问题,其中大多数正确地建议设置更高的
FcgidIOTimeout
选项值,但由于未知的原因,这对我的系统绝对没有影响。

我在回答我自己的问题,希望这将节省一些人处理此问题的时间

在这方面花费了相当多的时间,我发现罪魁祸首是在vhost配置中使用
FcgidCmdOptions
。如果已定义,全局fcgid选项将被忽略!因此,我必须在
FcgidCmdOptions
中设置
IOTimeout
选项,而不是设置
FcgidIOTimeout

最终配置如下所示:

<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>

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\u FCGI\u MAX\u请求=1000\
IOTimeout 3600\
连接超时3600\
MaxProcessLifeTime 7200\
IdleTimeout 3600\
MaxRequestsPerProcess 900
FcgidWrapper“c:php/php5.5.12/php cgi.exe”。php
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\u FCGI\u MAX\u请求=1000\
IOTimeout 3600\
连接超时3600\
MaxProcessLifeTime 7200\
IdleTimeout 3600\
MaxRequestsPerProcess 900
FcgidWrapper“c:php/php7.0.12/php7 cgi.exe”