Running mod_php and FastCGI side-by-side
Because we're in full throes of Zend Framework 2.0 development, I find myself with a variety of PHP binaries floating around my system from both the PHP 5.2 and 5.3 release series. We're at a point now where I'm wanting to test migrating applications from ZF 1.X to 2.0 to se see what works and what doesn't. But that means I need more than one PHP binary enabled on my server...
I use Zend Server on my development box; it's easy to install, and uses my native Ubuntu update manager to get updates. On Ubuntu, it installs the Debian Apache2 packages, so I get the added bonus of familiarity with the configuration structure.
I installed Zend Server some time ago, so I'm still on a PHP 5.2 mod_php binary. I have several PHP 5.3 binaries compiled and installed locally for running unit tests and sample scripts already -- so the question was how to keep my 5.2 mod_php running while simultaneously allowing the ability to run selected vhosts in 5.3?
The answer can be summed up in one acronym: FastCGI.
With a little help from Ralph Schindler, I got things setup.
Enabling FastCGI on Ubuntu's Apache
Interestingly, FastCGI is not enabled by default, nor is another module
mod_actions. You can enable these very easily
% cd /etc/apache2/mods-enabled % sudo ln -s ../mods-available/fastcgi.load . % sudo ln -s ../mods-available/fastcgi.conf . % sudo ln -s ../mods-available/actions.load . % sudo ln -s ../mods-available/actions.conf .
Create a FastCGI-enabled vhost
Next, you need to add a new vhost that will utilize FastCGI. I copied an
existing vhost I had in my
modified it to give it a unique
DocumentRoot, and added the following lines:
ScriptAlias /cgi-bin/ /path/to/zfproject/public/cgi-bin/ AddHandler php-fcgi .php Action php-fcgi /cgi-bin/php-5.3.1
The name of the PHP script doesn't matter much; I used "php-5.3.1" so that I could visually recognize what version of PHP I was using with that vhost.
Create a "cgi-bin" directory and CGI script
Finally, I needed to actually create the "cgi-bin" directory and CGI script
to execute. This was relatively simple; I navigated to my project's
DocumentRoot, and created a new directory "cgi-bin"
I then entered that directory and created a new script, based on the name I
provided in my vhost. That script, "cgi-bin/php-5.3.1" then simply
php-cgi binary from my PHP install.
My script looks like this:
#!/bin/bash exec /path/to/php/install/bin/php-cgi \"$@\"
Because this is a CGI binary, you can pass additional CLI arguments and
environment variables; try experimenting with setting your
include_path, application environment, etc.
Once you're done creating the script, make sure it's executable:
chmod a+x php-5.3.1
Fire it up!
Once I'd done the above, I restarted my Apache instance (
/etc/init.d/apache2 restart). After ensuring there were no startup
errors, I navigated to my new vhost, and voila! it was running.
For those of you doing your first forays into PHP 5.3, this is an excellent way to test code without needing a separate server running. It's also a great way to test whether your application is 5.3-ready -- create a 5.3-enabled vhost pointing to your existing application and see if it runs.blog comments powered by Disqus