logo
Apache Lounge
Webmasters

 

About Forum Index Downloads Search Register Log in  RSS Apache Lounge  


Keep Server Online

If you find the Apache Lounge, the downloads and overall help useful, please express your satisfaction with a donation.

or

Bitcoin

A donation makes a contribution towards the costs, the time and effort that's going in this site and building.

Thank You! Steffen

Your donations will help to keep this site alive and well, and continuing building binaries. Apache Lounge is not sponsored.


Post new topic   Forum Index -> Other Software View previous topic :: View next topic
Reply to topic   Topic: PHP as FCGID w/multiple PHP.INI files
Author
Brian



Joined: 21 Oct 2005
Posts: 209
Location: Puyallup, WA USA

PostPosted: Wed 10 Mar '10 1:24    Post subject: PHP as FCGID w/multiple PHP.INI files Reply with quote

First off, I did try to search AL for this topic, without success.

I have researched to the best of my current abilities to answer this without success.

Currently FCGID resolves the issue of stability having to call numerous non-thread-safe EXE's via PHP's EXEC() and SYSTEM() commands.

I have about 400 vhosts. I want to have at least two different PHP.INI files, at least two but maybe more.

The services I offer use a web-based file management, customized mail services, online image manipulation services, online media conversion services and so on. These all use a huge number of command line capable apps to make this all happen in this manner and PHP is so darn easy to code and secure, I just hate think that I have to go down a different path, starting over.

I could run some users, the bulk of my VHOSTS with the PHP module, but then I am running a more complicated environment than I would like to. If that is the only option for having multiple INI files, then so be it.

######################

My Questions: Is it possible in WAMP to run PHP exclusively as FCGID and have different PHP.INI files?

If so, how?

######################
Back to top
glsmith
Moderator


Joined: 16 Oct 2007
Posts: 2268
Location: Sun Diego, USA

PostPosted: Wed 10 Mar '10 3:33    Post subject: Reply with quote

php.example.com uses mod_php and it's one php.ini file
user1.example.com uses mod_fcgid and loads only the php.ini file in /home/user1
user2.example.com uses mod_fcgid and loads only the php.ini file in /home/user2
user3.example.com uses mod_fcgid but loads mod_php's php.ini file

Code:


#httpd.conf

LoadModule php5_module /php/php5apache2_2.dll
LoadModule fcgid_module modules/mod_fcgid.so
PHPIniDir /php

<IfModule fcgid_module>
# whatever directives wanted bla bla bla
# Use same php.ini as mod_php globally for mod_fcgid
FcgidInitialEnv PHPRC "/php"
</IfModule>


#httpd-vhost.conf

#using mod_php and /php/php.ini
<VirtualHost *:80>
    ServerName php.example.com
    DocumentRoot "/home/htdocs"
</VirtualHost>

#using mod_fcgid and /home/user1/php.ini
<VirtualHost *:80>
    ServerName user1.example.com
    DocumentRoot "/home/user1/htdocs"
      FcgidInitialEnv PHPRC "/home/user1"
      AddHandler fcgid-script .php
      FcgidWrapper "/php/php-cgi.exe" .php
</VirtualHost>

#using mod_fcgid and /home/user2/php.ini
<VirtualHost *:80>
    ServerName user2.example.com
    DocumentRoot "/home/user2/htdocs"
      FcgidInitialEnv PHPRC "/home/user2"
      AddHandler fcgid-script .php
      FcgidWrapper "/php/php-cgi.exe" .php
</VirtualHost>

#using mod_fcgid and global php.ini
<VirtualHost *:80>
    ServerName user3.example.com
    DocumentRoot "/home/user3/htdocs"
      AddHandler fcgid-script .php
      FcgidWrapper "/php/php-cgi.exe" .php
</VirtualHost>


There may be other ways to do this but this works for me.
There is no need to use mod_php I just did it cause I want to show the mix & match aspect of it.


Last edited by glsmith on Wed 10 Mar '10 18:34; edited 1 time in total
Back to top
Brian



Joined: 21 Oct 2005
Posts: 209
Location: Puyallup, WA USA

PostPosted: Wed 10 Mar '10 7:25    Post subject: Reply with quote

Many thanks for this incredibly simple explanation.

Checked the test INI files, perfect.

Currently I am in test flight, but this solution looks promising.

Question: Do you notice any change in memory usage?

Even if the processing load creates more load, even if it were to and if it were to use more RAM, so what! This should be rock solid stable.

Thank you very much for your fast reply.
Back to top
James Blond
Moderator


Joined: 19 Jan 2006
Posts: 7104
Location: Germany, Next to Hamburg

PostPosted: Wed 10 Mar '10 10:36    Post subject: Reply with quote

Hi Brian,
there no more usage with using different ini files as I know from my experience. At least if you don't load a different number of extensions. You should also be able to load different php version. Sometimes very useful for testing.
Back to top
Brian



Joined: 21 Oct 2005
Posts: 209
Location: Puyallup, WA USA

PostPosted: Thu 11 Mar '10 5:28    Post subject: Reply with quote

Different PHP versions, actually that can be important.

I have one extension that I use with ImageMagick, it requires a 4.x.x version of PHP but does somethings that I need very nicely.

I will probably end up running PHP as CGI and Module after all.

FCGID has really come a long ways with regards for PHP support and on Windows it really was needed.

I am running a full testing server on my workstation and so far I am very happy.

I have not had a chance to set up MySQL and also MSSQL yet. I also have an application for using an ODBC connection (SQLite3?) to pull data to generate reports from a Spiceworks db file. I used SQLite3 to pull live data into Excel so I assume that is the same connector PHP would use, not sure yet though.

I really appreciate AL and the many experienced contributors here, my simple question was thoroughly and quickly answered. Thank you.
Back to top
flatcircle



Joined: 27 Jun 2006
Posts: 79

PostPosted: Thu 11 Nov '10 15:18    Post subject: Reply with quote

Is this correct?

<VirtualHost *:80>
ServerName php.example.com
DocumentRoot "/home/htdocs"
</VirtualHost>

Shouldn't the line:

Code:
AddType application/x-httpd-php .php


be included as well?

mod_php => AddType application/x-httpd-php .php

Code:
<VirtualHost *:80>
    ServerName php.example.com
    DocumentRoot "/home/htdocs"
    AddType application/x-httpd-php .php
</VirtualHost>



mod_fcgid => AddHandler fcgid-script .php

Code:
<VirtualHost *:80>
    ServerName user1.example.com
    DocumentRoot "/home/user1/htdocs"
    FcgidInitialEnv PHPRC "/home/user1"
    AddHandler fcgid-script .php
    FcgidWrapper "/php/php-cgi.exe" .php
</VirtualHost>
Back to top
Otomatic



Joined: 01 Sep 2011
Posts: 81
Location: Paris, France, EU

PostPosted: Mon 03 Jan '22 17:44    Post subject: Reply with quote

Hi,

I know that this thread is old, nevertheless, since we talk about Wampserver and that it is there, with the help of glasmith - thanks to him - that I found how to do it, I post here :
How to use fcgid_module and have different PHP versions for VirtualHost
- Procedure done under Wampserver 3.2.7 with Apache 2.4.52
To be done with Wampserver not started.

- 1 - Of course, the first thing to do is to download fcgid_module from the Apache Lounge download page depending on whether you use 32 or 64 bit Wampserver.
Unzip the related zip file and copy the 'mod_fcgid.so' file to the wamp(64)\bin\apache2.4.52\modules\ folder

- 2 - Edit the file wamp(64)\bin\apache2.4.52\conf\httpd.conf
Under the line: LoadModule php_module "${INSTALL_DIR}/bin/php/php.... (About line 199)
Be careful, it can be php7_module or php5_module depending on the php version used.
Add:
Code:

LoadModule fcgid_module modules/mod_fcgid.so
<IfModule fcgid_module>
  FcgidMaxProcessesPerClass 300
  FcgidConnectTimeout 10
  FcgidProcessLifeTime 0
  FcgidMaxRequestsPerProcess 0
  FcgidMinProcessesPerClass 0
  FcgidFixPathinfo 0
  FcgidZombieScanInterval 20
  FcgidMaxRequestLen 536870912
  FcgidIOTimeout 120
  FcgidTimeScore 3
  FcgidPassHeader Authorization
  Define PHPROOT ${INSTALL_DIR}/bin/php/php
</IfModule>


If you start Wampserver at this moment, nothing will change, all the VirtualHost will always use the version of PHP defined by the menu Left-Click -> PHP, i.e. PHP defined as an Apache module.

To use another PHP version, of course provided that this version already exists in Wampserver as an addon, simply modify the desired VirtualHost as follows:

By default, a VirtualHost created by Wampserver looks like this:
Code:

<VirtualHost *:80>
  ServerName mysite
  DocumentRoot "G:/www/myfolder"
  <Directory "G:/www/myfolder/">
    Options +Indexes +Includes +FollowSymLinks +MultiViews
    AllowOverride all
    Require local
  </Directory>
</VirtualHost>

In order for this VirtualHost to use fcgid_module and another version of PHP, we just need to add four lines, the first of which defines the version of PHP to be used and, to avoid any error if the fcgid_module is not loaded, we will frame these four lines with a <IfModule fcgid_module>... </IfDefine> structure:
Code:

  <IfModule fcgid_module>
    Define FCGIPHPVERSION "7.2.34"
    FcgidInitialEnv PHPRC ${PHPROOT}${FCGIPHPVERSION}
    AddHandler fcgid-script .php
    FcgidWrapper "${PHPROOT}${FCGIPHPVERSION}/php-cgi.exe" .php
  </IfDefine>


and you must add the +ExecCGI option in the Directory options for the VirtualHost.
This makes the VirtualHost become:
Code:

<VirtualHost *:80>
  ServerName mysite
  DocumentRoot "G:/www/myfolder"
  <IfModule fcgid_module>
    Define FCGIPHPVERSION "7.2.34"
    FcgidInitialEnv PHPRC ${PHPROOT}${FCGIPHPVERSION}
    AddHandler fcgid-script .php
    FcgidWrapper "${PHPROOT}${FCGIPHPVERSION}/php-cgi.exe" .php
  </IfDefine>
  <Directory "G:/www/myfolder/">
    Options +Indexes +Includes +FollowSymLinks +MultiViews +ExecCGI
    AllowOverride all
    Require local
  </Directory>
</VirtualHost>

And that's all.


Last edited by Otomatic on Tue 04 Jan '22 10:28; edited 1 time in total
Back to top
Steffen
Moderator


Joined: 15 Oct 2005
Posts: 2930
Location: Hilversum, NL, EU

PostPosted: Mon 03 Jan '22 17:59    Post subject: Reply with quote

Thanks for sharing.
Back to top
James Blond
Moderator


Joined: 19 Jan 2006
Posts: 7104
Location: Germany, Next to Hamburg

PostPosted: Tue 04 Jan '22 13:18    Post subject: Reply with quote

Otomatic wrote:


and you must add the +ExecCGI option in the Directory options for the VirtualHost.
This makes the VirtualHost become:


Nope! Don't do that. Only enable that for php files.

Code:

# httpd.conf

Define PHP80RC "C:\\php80"

<IfModule fcgid_module>
   FcgidConnectTimeout 10
   FcgidMaxProcesses 300
   FcgidMaxProcessesPerClass 300
   FcgidOutputBufferSize 64
   ProcessLifeTime 0
   FcgidMaxRequestsPerProcess 0
   FcgidMinProcessesPerClass 0
   FcgidFixPathinfo 0
   FcgidProcessLifeTime 0
   FcgidZombieScanInterval 20
   FcgidMaxRequestLen 536870912
   FcgidIOTimeout 120
   FcgidTimeScore 3
</IfModule>


Code:

#vhost config file
<VirtualHost *:80>
   ServerName website

   DirectoryIndex index.php index.html index.htm

   <IfModule fcgid_module>
      FcgidInitialEnv PHPRC "${PHP80RC}"
      FcgidInitialEnv PATH "${PHP80RC};C:\\WINDOWS\\system32;C:\\WINDOWS;C:\\WINDOWS\\System32\\Wbem;"
      FcgidInitialEnv SystemRoot "C:\\Windows"
      FcgidInitialEnv SystemDrive "C:"
      FcgidInitialEnv TEMP "C:\\WINDOWS\\TEMP"
      FcgidInitialEnv TMP "C:\\WINDOWS\\TEMP"
      FcgidInitialEnv windir "C:\\WINDOWS"
      FcgidPassHeader Authorization
      <Files ~ "\.php$">
         Options Indexes FollowSymLinks ExecCGI
         AddHandler fcgid-script .php
         FcgidWrapper "C:/php80/php-cgi.exe" .php
      </Files>
   </IfModule>

   CustomLog "C:\nul" common

   DocumentRoot "G:/www/myfolder"
   <Directory "G:/www/myfolder">
      Options Indexes FollowSymLinks
      AllowOverride All
      Require all granted
   </Directory>
</VirtualHost>


As you can see <Files ~ "\.php$"> is a much better option for security.
Back to top
Otomatic



Joined: 01 Sep 2011
Posts: 81
Location: Paris, France, EU

PostPosted: Fri 14 Jan '22 16:28    Post subject: Reply with quote

Hi,

Here I am now and it seems to work correctly while keeping PHP as an Apache module that coexists with fcgid_module.

In the file httpd.conf:
Code:
PHPIniDir "${APACHE_DIR}/bin"
LoadModule php_module "${INSTALL_DIR}/bin/php/php8.1.1/php8apache2_4.dll"

LoadModule fcgid_module modules/mod_fcgid.so
<IfModule fcgid_module>
  FcgidMaxProcessesPerClass 300
  FcgidConnectTimeout 10
  FcgidProcessLifeTime 1800
  FcgidMaxRequestsPerProcess 0
  FcgidMinProcessesPerClass 0
  FcgidFixPathinfo 0
  FcgidZombieScanInterval 20
  FcgidMaxRequestLen 536870912
  FcgidBusyTimeout 120
  FcgidIOTimeout 120
  FcgidTimeScore 3
  FcgidPassHeader Authorization
  Define PHPROOT ${INSTALL_DIR}/bin/php/php
</IfModule>

In the httpd-vhosts.conf, to use fcgi in place of Apache module.
Code:
<VirtualHost *:80>
   ServerName faq-fra-fcgi
   DocumentRoot "g:/www/faq-fra"
  <IfModule fcgid_module>
    Define FCGIPHPVERSION "7.4.27"
    FcgidInitialEnv PHPRC ${PHPROOT}${FCGIPHPVERSION}
    <Files ~ "\.php$">
      Options +Indexes +Includes +FollowSymLinks +MultiViews +ExecCGI
      AddHandler fcgid-script .php
      FcgidWrapper "${PHPROOT}${FCGIPHPVERSION}/php-cgi.exe" .php
    </Files>
  </IfModule>
   <Directory  "g:/www/faq-fra/">
      Options +Indexes +Includes +FollowSymLinks +MultiViews
      AllowOverride All
      Require local
   </Directory>
</VirtualHost>


Where I had a little problem is for the aliases.
Indeed if I apply for the aliases the same procedure as for the VirtualHost, for example for the alias PhpMyAdmin 5.1.1 which is not compatible with PHP 8.1.1:
Code:

Alias /phpmyadmin "E:/wamp64/apps/phpmyadmin5.1.1/"
<IfModule fcgid_module>
  Define FCGIPHPVERSION "7.4.27"
  FcgidInitialEnv PHPRC ${PHPROOT}${FCGIPHPVERSION}
  <Files ~ "\.php$">
    Options +Indexes +Includes +FollowSymLinks +MultiViews +ExecCGI
    AddHandler fcgid-script .php
    FcgidWrapper "${PHPROOT}${FCGIPHPVERSION}/php-cgi.exe" .php
  </Files>
</IfModule>
<Directory "E:/wamp64/apps/phpmyadmin5.1.1/">
  Options +Indexes +FollowSymLinks +MultiViews
  AllowOverride all
  Require local
</Directory>

This alias being launched by 'http://localhost/phpmyadmin/' it is the whole localhost which passes in fcgi mode and that, I do not want it. I want localhost to stay in Apache module.
To do this, I first wanted to put the <IfModule...>...</IfModule> structure into the <Directory...>...</Directory> structure so that fcgi mode only applies to this Directory, but the FcgidInitialEnv directive is not accepted in <Directory.
I then split <IfModule...>...</IfModule> into two parts, as below:

Code:
Alias /phpmyadmin "E:/wamp64/apps/phpmyadmin5.1.1/"
<IfModule fcgid_module>
  Define FCGIPHPVERSION "7.4.27"
  FcgidInitialEnv PHPRC ${PHPROOT}${FCGIPHPVERSION}
</IfModule>
<Directory "E:/wamp64/apps/phpmyadmin5.1.1/">
  Options +Indexes +FollowSymLinks +MultiViews
  AllowOverride all
  Require local
  <IfModule fcgid_module>
    <Files ~ "\.php$">
      Options +Indexes +Includes +FollowSymLinks +MultiViews +ExecCGI
      AddHandler fcgid-script .php
      FcgidWrapper "${PHPROOT}${FCGIPHPVERSION}/php-cgi.exe" .php
    </Files>
  </IfModule>
</Directory>

It works as I want, only the Directory goes to fcgi mode, localost remains in Apache module mode.

The question I ask myself: Is this the right method?
Back to top
James Blond
Moderator


Joined: 19 Jan 2006
Posts: 7104
Location: Germany, Next to Hamburg

PostPosted: Fri 14 Jan '22 17:09    Post subject: Reply with quote

You are doing it right with the fcgid config inside the directory.

On the other hand, I use "directory junctions" like a directory symlink on Linux. In that case, the config from the vhost is enough.

I wonder why you don't run fcgid only, but the module, too.
Back to top
Otomatic



Joined: 01 Sep 2011
Posts: 81
Location: Paris, France, EU

PostPosted: Sat 15 Jan '22 10:14    Post subject: Reply with quote

James Blond wrote:
I wonder why you don't run fcgid only, but the module, too.

Hi,

Because, as already explained in a previous message, Wampserver exists since more than seventeen years and was developed with PHP as an Apache module (PHP 3 and 4 and Apache 1.9 then 2) and that everything is made so that the beginner can develop locally without headache.
The menus for modifying extensions and configuration of PHP have been defined for the version of PHP used as an Apache module and it is impossible to make menus for all versions used in FCGI mode.
Back to top
Jan-E



Joined: 09 Mar 2012
Posts: 1172
Location: Amsterdam, NL, EU

PostPosted: Sun 23 Jan '22 1:47    Post subject: Reply with quote

James Blond wrote:
I wonder why you don't run fcgid only, but the module, too.

I recently ran into a problem with a script that only worked with mod_php. gitpull.php does essentially this
Code:
<?php
$ret = exec('"C:\Program Files\git\bin\git.exe" pull', $out);
echo $out;
?>

This only worked with mod_php, not with mod_fcgid. With mod_fcgid git.exe somehow asked for my credentials, which could not be provided in a exec'd script.

My solution was creating a extra file type .mod_php with handler application/x-httpd-php and rename the file into gitpull.mod_php. That worked.

Even when running git.exe at the command prompt it can be a frustating job since github removed support for password authentication, but I really would not know why the script succeeds with mod_php and fails with mod_fcgid.

Edit It had something to do with using OpenSSL. When I changed the http.sslBackend to schannel it worked also with mod_fcgid.
Back to top
alfred0809



Joined: 22 May 2022
Posts: 2
Location: Bangalore

PostPosted: Sun 22 May '22 8:23    Post subject: reply Reply with quote

I have not had a chance to set up MySQL and also MSSQL yet. I also have an application for using an ODBC connection (SQLite3?) to pull data to generate reports from a Spiceworks db file. I used SQLite3 to pull live data into Excel so I assume that is the same connector PHP would use, not sure yet though.
Back to top


Reply to topic   Topic: PHP as FCGID w/multiple PHP.INI files View previous topic :: View next topic
Post new topic   Forum Index -> Other Software