2016-10-21 2 views
2

J'ai configuré plusieurs versions de PHP sous Apache sous Windows en utilisant mod_fcgid. La configuration est comme ceci:mod_fcgid lecture timeout à partir de pipe, fin de sortie de script avant en-têtes, plusieurs versions de 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 

Et puis un gestionnaire de fcgi spécifique dans chaque directive 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> 

De cette façon http://example.local/ fonctionne avec PHP 5.5, mais http://example.local:81/ sert le même code mais avec PHP 7.0. Très pratique pour tester plusieurs versions de PHP sur le même système.

Mais je continue d'obtenir des délais d'attente fcgi après environ 40-60 secondes, ce qui m'empêche d'utiliser efficacement xdebug.

J'ai vérifié le nombre de questions similaires sur SO, dont la plupart suggèrent correctement de définir une valeur plus élevée de FcgidIOTimeout option, mais pour une raison inconnue cela n'a absolument aucun effet sur mon système.

Répondre

1

Je réponds à ma propre question en espérant que cela épargnera à quelqu'un des heures de lutte contre ce problème. Après avoir passé beaucoup de temps à ce sujet, j'ai pensé que le coupable était en utilisant FcgidCmdOptions en configuration vhost. Si elle est définie, les options globales fcgid sont simplement ignorées! Donc, au lieu de définir FcgidIOTimeout, j'ai dû définir l'option IOTimeout dans FcgidCmdOptions.

La configuration finale est la suivante:

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