Multiple PHP versions with Apache 2, FastCGI, PHPFarm on Ubuntu

Multiple PHP versions with Apache 2, FastCGI, PHPFarm on Ubuntu

This tutorial is a part of the “Setting up your local development environment” series. It is based on this article while keeping in mind that in previous apache tutorial we compiled apache from source. So I’m definitely not taking all the credit for it. But there are some modifications.

Starting with PHPFarm, we need Git installed in order to check it out. If you don’t have it installed:

  1. sudo apt-get install git-core

Now create a directory in which PHP versions will reside. The directory of my liking is /usr/local/php, so I will use that. You can of course change that.

  1. cd /usr/local

Clone the phpfarm repository.

  1. git clone git:// php

Now we have to edit the configuration options which phpfarm will use to compile php.

  1. cd php/src

We can use more general configuration options or very strict ones. Default configuration can be overridden by creating a file called or a bit more specific like or very strict like Since the configurations for 5.2 and 5.3 are different and I like to be a strict person, I will create two configurations:

  • contents (these config values were also mentioned in previous tutorial):

  1. configoptions="
  2.         –enable-cli \
  3.         –with-pear \
  4.         –with-openssl=/usr \
  5.         –with-iconv \
  6.         –with-curl \
  7.         –with-mysqli \
  8.         –enable-mbstring \
  9.         –enable-exif \
  10.         –with-jpeg-dir=/usr \
  11.         –with-zlib \
  12.         –with-zlib-dir \
  13.         –with-png-dir=/usr \
  14.         –with-gd \
  15.         –with-gettext \
  16.         –enable-gd-native-ttf \
  17.         –with-mhash \
  18.         –enable-ftp \
  19.         –with-pspell \
  20.         –with-mcrypt \
  21.         –enable-bcmath \
  22.         –with-mime-magic \
  23.         –with-pdo-mysql \
  24.         –enable-sockets \
  25.         –enable-soap \
  26.        –enable-calendar \
  27.         –enable-fastcgi \
  28.         –enable-force-cgi-redirect \
  29. " contents:

  1. configoptions="
  2.         –with-mysqli=mysqlnd \
  3.         –with-pdo-mysql=mysqlnd \
  4.         –enable-cli \
  5.         –with-pear \
  6.         –with-openssl=/usr \
  7.         –with-iconv \
  8.         –with-curl \
  9.         –enable-mbstring \
  10.         –enable-exif \
  11.         –with-zlib \
  12.         –with-zlib-dir \
  13.         –with-gd \
  14.         –with-gettext \
  15.         –enable-gd-native-ttf \
  16.         –with-mhash \
  17.         –enable-ftp \
  18.         –with-pspell \
  19.         –with-mcrypt \
  20.         –enable-bcmath \
  21.         –enable-sockets \
  22.         –enable-soap \
  23.         –enable-calendar \
  24.         –with-png-dir=/usr \
  25.         –with-jpeg-dir=/usr
  26. "

For PHP 5.3 we don’t need the cgi parameters, since these are already enabled by default.

On Ubuntu 11.04, the configuration might fail with error messages about libjpeg and/or libpng. What you can do is the following:

  1. sudo apt-get install libjpeg8-dev

Install the libjpeg8-dev package. This will solve the libjpeg error message.

  1. sudo ln -s /usr/lib/x86_64-linux-gnu/ /usr/lib/

Create a symbolic link to the in the /usr/lib directory. This will solve the libpng error message.

Next step – compiling PHP.

  1. sudo ./ 5.2.17
  2. sudo ./ 5.3.18

Where the number after the ./ is the PHP version you wish to compile.

Now that we have compiled PHP, we can move on to set up apache. If you followed the apache tutorial, first of we need to recompile it.

  1. ./configure \
  2.         –prefix=/usr/local/apache2.2.22 \
  3.         –with-included-apr \
  4.         –enable-mods-shared=all \
  5.         –enable-so \
  6.         –enable-mod-rewrite \
  7.         –enable-suexec \
  8.         –with-suexec-caller=daemon

These are just my configuration options. The options you have to pay attention to for this topic are:

  • –enable-so
  • –enable-suexec
  • –enable-suexec-caller=daemon – You can change this according to which user your apache runs under.
  1. make
  2. sudo make install

Apache should be up and running. Next stop – FastCGI module.

Download and extract the latest (current) source from

  1. tar xzf mod_fastcgi-current.tar.gz
  2. cd mod_fastcgi-2.4.6

Next thing to do is rename Makefile.AP2 to Makefile, so we can compile it for apache 2.

  1. cp Makefile.AP2 Makefile

Compile and install the module.

  1. make top_dir=/usr/local/apache2.2.22
  2. sudo make install top_dir=/usr/local/apache2.2.22

The top_dir parameter is optional. If you compiled apache to the more usual location like /usr/local/apache2, you do not need to set this option.

Now that we have mod_fastcgi module compiled, we can load it as a shared object. Add the following line to your httpd.conf:

  1. LoadModule fastcgi_module modules/

If you had previously ran PHP as an apache module, you must disable it. You can only run PHP either as CGI or an apache module. So in httpd.conf, comment out this line:

  1. # LoadModule php5_module modules/

Create a .conf file (you can call it what you want) – i.e. php-fcgi.conf and put the following content inside:

  1. <IfModule mod_fastcgi>
  2.     FastCgiWrapper /usr/lib/apache2.2.22/bin/suexec
  3.     FastCgiConfig -idle-timeout 110 -killInterval 120 -pass-header
  4.         HTTP_AUTHORIZATION -autoUpdate
  6.     ScriptAlias /php-fcgi/ /var/www/cgi-bin/
  7. </IfModule>

And include it in your main httpd.conf:

  1. # Include FastCGI configuration
  2. Include conf/php-fcgi.conf

Now create a directory for CGI scripts.

  1. sudo mkdir /var/www/cgi-bin

And create scripts.

  1. sudo nano /var/www/cgi-bin/php-cgi-5.2.17
  2. sudo nano /var/www/cgi-bin/php-cgi-5.3.18

And put something like the following in. Just change the version of PHP.

  1. #!/bin/sh
  2. version="5.3.18"
  4. PHPRC=/usr/local/php/phpfarm/inst/php-${version}/lib/php.ini
  5. export PHPRC
  13. # which php-cgi binary to execute
  14. exec /usr/local/php/phpfarm/inst/php-${version}/bin/php-cgi

These scripts should be executable. So we set permissions to 0755.

  1. cd /var/www/cgi-bin
  2. sudo chmod +x *

Now we configure apache virtualhosts. Each virtualhost will have it’s own subdomain and PHP version.

  1. NameVirtualHost localhost.53:80
  2. <VirtualHost localhost.53:80>
  3.   ServerName localhost.53
  4.   DocumentRoot /var/www
  5.   <Directory "/var/www">
  6.     AddHandler php-cgi .php
  7.     Action php-cgi /php-fcgi/php-cgi-5.3.18
  8.   </Directory>
  9. </VirtualHost>

Do the same for all versions of PHP.

We are almost there. Since these subdomains (asumingly) do not exist yet, we must point them to your localhost IP.

  1. sudo nano /etc/hosts

Just add your subdomains after the localhost definition. It should look something like this:

  1. localhost localhost.52 localhost.53

Everything is set, so just restart the apache.

  1. sudo /usr/local/apache2.2.22/bin/apachectl -k restart

Put a file phpinfo.php in /var/www directory with the following line:

And test it. If everything went well, you should see different PHP versions on different subdomains.

  • http://localhost.52/phpinfo.php – PHP 5.2.17
  • http://localhost.53/phpinfo.php – PHP 5.3.18


Post updated on November 12th, 2012th to reflect latest updates.

24 Responses so far.

  1. Hey, i hope you can help me.. i have follow your tutorials. with phpfarm. if i compile version php 5.3.5 after i have make a
    the error there are come on the console is.

    web02:/etc/php/phpfarm/src# ./ 5.3.5

    5.3.5 5 3 5
    Segmentation fault

    my custom-options file is.

    web02:/etc/php/phpfarm/src# nano

    –enable-bcmath \
    –enable-calendar \
    –enable-exif \
    –enable-ftp \
    –enable-mbstring \
    –enable-pcntl \
    –enable-soap \
    –enable-sockets \
    –enable-sqlite-utf8 \
    –enable-wddx \
    –enable-zip \
    –with-zlib \
    –with-gettext \
    –with-mysql=/usr/bin/mysql_config \
    –with-mysqli=shared,mysqlnd \
    –with-pdo-mysql=shared,mysqlnd \

    i hope you can help me.

    sorry about my english

  2. Metod says:


    I can try. :)

    These are the things I would do:
    * Try to set the configoptions without the $gcov, just include the –enable-gcov at the end.
    * Try to eliminate all the configuration, just leave one like –enable-bcmath, so you can see if one of those options triggers the segmentation fault.
    * If that fails you can always just compile PHP manually which I described here – But then you must adjust a thing or two like the path to your php.ini and php-cgi binary.

    I hope one of these points help you out! 😉

  3. Celso says:

    sudo ./ 5.2.17 returns this error

    5.2.17 5 2 17
    configure: warning: –enable-cli: invalid host type
    configure: warning: –with-pear: invalid host type
    configure: error: can only configure for one host and one target at a time failed.

  4. Celso says:

    I couldn’t get this to work..

    I’ve try to remove all compile options that doesn’t work like –with-openssl and at the end I get this message.

    PHP Warning: Unexpected character in input: ‘\’ (ASCII=92) state=1 in
    /usr/local/php/inst/php-5.2.17/pyrus.phar on line 50

    Looks like pyrus.phar doesn’t work with php 5.2

    Any help wold be appreciate

  5. Metod says:

    Pyrus only works for PHP 5.3+, yes.

    As for the invalid host type error: Check that you don’t have any whitespaces between and that you typed the options correctly. It’s not how you see it here – I should fix it – the browser transforms -- into –.

    So the option –with-openssl should actually be --with-openssl and so on :)

  6. I am having some trouble with php 5.3 installations. My joomla startup check tells me, that there is no mysql as well as no zlib extension installed.

    Do you have any idea what might be going wrong here? Any help is greatly appreciated!

  7. Metod says:

    Can you post your configure options? And did any error occur during the compilation?

  8. No, there were no errors at all. This is my config:

    –with-mysql=mysqlnd \
    –with-mysqli=mysqlnd \
    –with-pdo-mysql=mysqlnd \
    –enable-cli \
    –with-pear \
    –with-openssl=/usr \
    –with-iconv \
    –with-curl \
    –enable-mbstring \
    –enable-exif \
    –with-zlib \
    –with-zlib-dir \
    –with-gd \
    –with-gettext \
    –enable-gd-native-ttf \
    –with-mhash \
    –enable-ftp \
    –with-pspell \
    –with-mcrypt \
    –enable-bcmath \
    –enable-sockets \
    –enable-soap \
    –enable-calendar \
    –with-png-dir=/usr \
    –with-jpeg-dir=/usr \

  9. Metod says:

    Hmmm, check your phpinfo() output. If the page says you have zlib and mysql support, then the problem is in Joomla.

  10. Dorthe says:

    Thanx for the tutorial, very helpful.

    To get around the error messages of libjpeg I also had to run:

    sudo ln -s /usr/lib/x86_64-linux-gnu/ /usr/lib/

  11. Eoin says:

    Thanks for the tutorial. I have it working on my Ubuntu Server 12.04LTS setup.

    However, I’m totally new to Linux and I now have a totally newb question: How can I access the sites served by this installation over my home network?

    I’m pretty sure something is not set up correctly, as I get two different results when accessing the machine by name or by IP in my browser, but neither of them are correct – access by name shows the same index as visiting localhost on the machine itself, except it’s plain text, not served PHP, and accessing by IP shows the apache htdocs/index.html

    • Metod says:

      You should probably add another VirtualHost with the same configuration as you have for (i.e. localhost.53) with the name of the domain you want it accessible by.

      Like if you have a, make another NameVirtualHost this-is-my-domain.com53:80 and then …

      I hope you get the idea.

      • Eoin says:

        Thanks for the help, Metod. However, I’m still having a problem. I will understand if you don’t want to get into this any further, so feel free to say so!

        On my windows machine I have this in my hosts file: test.com53
        Then on my ubuntu machine I have this in my hosts file: test.com53
        Finally, in my vhosts file I have:
        NameVirtualHost test.com53:80

        ServerName test.com53
        DocumentRoot /var/www/html/_test

        AddHandler php-cgi .php
        Action php-cgi /cgi-bin/php-cgi-5.3.28

        SetHandler php-cgi

        When I use: wget -O ~/test.html test.com53 from the ubuntu machine, the test.html file shows the correct content, but when I try to visit test.com53 from my windows machine, I see the index.php file in /var/www, and it is not being served as php, just plaintext.

  12. Esperinas says:

    Hi all,

    I do use Unbuntu-server 12.04 on VPS.
    Php by default is 5.3.10, but I need also Php 5.2.17.

    I’m trying install Phpfarm, but:
    /opt/phpfarm/src# ./ 5.2.17

    Returns errors :
    5.2.17 5 2 17
    configure: warning: \: invalid host type
    configure: warning: \: invalid host type
    configure: error: can only configure for one host and one target at a time failed.

    Please, could you help me ?

  13. zunz says:

    anyone experience 404 not found issue ? most likely on ajax links ?

    hope anyone can help me.

  14. […] – How to run multiple versions of PHP on the same computer Multiple PHP versions with Apach2, FastCGI, PHPFarm on Ubuntu Setting up your local development environment […]

  15. […] See for the complete installation the linked question. Don’t forget to look at the two links in the header as well, they look like nice tutorials (but less compressed). This and That […]

  16. […] – How to run multiple versions of PHP on the same computer Multiple PHP versions with Apach2, FastCGI, PHPFarm on Ubuntu Setting up your local development environment […]

  17. eset says:

    Something is wrong.. it doesn’t work with -enable and -with at all , always gives errors. Something changed? I was doing this on Ubuntu 15. I had delete all options. Made only: configoptions=”\”

    • eset says:

      Ok first of all. New PHP have diffrent -enable mods during the configure. Best way is to enter the PHP-$version catalog and give ./configure –help to test what kind of options are avalaible. Second after compile important thing is to enable cgi mod by $ a2enmod cgi fastcgi / I had only fastcgi mod enabled And it didn’t worked for me. After enabling cgi it worked.

  18. Hi, thanks for the tutorial.

    After all the steps completed successfully, I get this error when accessing the website:

    Not Found

    The requested URL /php-fcgi/php-cgi-5.2.17/phpinfo.php was not found on this server.

    Apache/2.4.18 (Ubuntu) Server at Port 80

    Here are my configuration files:

    cat /etc/apache2/conf-enabled/php-fcgi.conf

    FastCgiWrapper /usr/lib/apache2/suexec
    FastCgiConfig -idle-timeout 110 -killInterval 120 -pass-header

    ScriptAlias /php-fcgi/ /var/www/cgi-bin/

    cat /etc/apache2/sites-enabled/php5217.conf

    DocumentRoot /var/www/website

    Options FollowSymLinks
    AllowOverride All

    Options Indexes FollowSymLinks MultiViews
    AllowOverride All
    Order allow,deny
    allow from all
    AddHandler php-cgi .php
    Action php-cgi /php-fcgi/php-cgi-5.2.17

    LogLevel warn

    cat /var/www/cgi-bin/php-cgi-5.2.17

    export PHPRC



    # which php-cgi binary to execute
    exec /usr/local/php/phpfarm/inst/php-${version}/bin/php-cgi

    Any help is appreciated, thanks