Running Apache with multiple PHP fcgis

I now set up my local windows dev system with apache httpd and php to use fcgi and allow multiple PHP versions; especially so I can run PHP 5.2 with Ice 3.3 as well as PHP 5.3 with Ice 3.4 at the same time, without reconfiguration and restart.

I already wrote once about setting apache httpd up for fcgi and suEXEC, and this one could be called similar. But ofc. it was a pain in the ass, with non-talking error messages all over.

If you’re installing or updating to PHP 5.2.14 make sure to use php_curl from version 5.2.13, as the new one falsely requires a dll.

(Also, php_curl failed entirely with my php5.2.14 threadsafe, the 5.2.13 one as well…)

Also, I set FcgidFixPathinfo to 0, as 1 didn’t quite work and I am still using PHP 5.2 as well.

In short, what I did, or rather how it looks like now:

<IfModule !fcgid_module>
  LoadModule fcgid_module modules/mod_fcgid.so
  <IfModule fcgid_module>
    AddHandler fcgid-script .php
    # Maximum requests a process handles before it is terminated FcgidMaxRequestsPerProcess  1000
    # if cgi.fix_pathinfo is set to 1 in php.ini: # http://httpd.apache.org/mod_fcgid/mod/mod_fcgid.html#fcgidfixpathinfo ; http://php.net/manual/en/ini.core.php#ini.cgi.fix-pathinfo ; available since php 4.3
    FcgidFixPathinfo 0
    # Maximum number of PHP processes
    FcgidMaxProcesses           3
    # Number of seconds of idle time before a process is terminated
    FcgidIOTimeout              240
    FcgidIdleTimeout                 240
    FcgidConnectTimeout         20

    # PHP 5.2.14
    FcgidInitialEnv      PHPRC "D:\pathto\PHP\php5.2.14\conf"
    FcgidWrapper         "D:\pathto\PHP\php5.2.14\php-cgi.exe" .php

    #FcgidCmdOptions       "D:\pathto\PHP\php5.2.14_nts\php-cgi.exe" InitialEnv PHPRC=D:\pathto\PHP\php5.2.14_nts\conf
    #FcgidWrapper          "D:\pathto\PHP\php5.2.14_nts\php-cgi.exe" .php
  </IfModule>
</IfModule>

And in my VirtualHost:

FcgidCmdOptions       "D:\pathto\PHP\php-5.3.3-Win32-VC9-x86\php-cgi.exe" InitialEnv PHPRC=D:\pathto\PHP\php-5.3.3-Win32-VC9-x86\conf
FcgidCmdOptions       "D:\pathto\PHP\php-5.3.3-Win32-VC6-x86\php-cgi.exe" InitialEnv PHPRC=D:\pathto\PHP\php-5.3.3-Win32-VC6-x86\conf
<Directory "G:\www\php53">
  #FcgidWrapper                "D:\pathto\PHP\php-5.3.3-Win32-VC9-x86\php-cgi.exe" .php
  FcgidWrapper                "D:\pathto\PHP\php-5.3.3-Win32-VC6-x86\php-cgi.exe" .php
  Options +ExecCGI
</Directory>

To get the depended on dlls of php_ice I used dependency walker and copied those required ones to the php folder.

Those were:

For Ice 3.3:

  • bzip2.dll
  • ice33.dll
  • iceutil33.dll
  • slice33.dll
  • stlport_vc646.dll

For Ice 3.4:

  • bzip2_vc6.dll
  • iceutilvc60_34.dll
  • icevc60_34.dll
  • slicevc60_34.dll