in PHP

Compiling PHP 5.5 From Scratch

There’s always a lag behind new releases of PHP and releases of packages for operating systems such as Ubuntu. This lag time means that you could be kept from upgrading to the latest and greatest PHP for a year or more, unless you use an outside repository like Dotdeb. Of course, even when using one of these outside sources, you may still find a lag in the security and bugfixes made available to you.

Instead, I roll my own version of PHP. It’s simple and easy to do, and something that any developer can do. Here’s my instructions for doing so on a fresh Ubuntu installation.

Why you should consider “rolling your own” PHP installation

There are a ton of great PHP packages out there. Some people use the default packages built into the package repositories; others use Dotdeb. But for true professional PHP developers, understanding how to install and compile PHP against their operating system is somewhat important.

In my case, I want to use the latest versions of PHP, since the tools I’m using often track the most recent releases (PHPUnit, PHPMD, etc.). Therefore, it’s important that the small improvements are available to me.

Getting started

It’s worth noting that I started with a completely clean install of Ubuntu, that had never had Apache or PHP installed on it before. If you’re starting with a server that’s had either of these installed on it, you will need to modify your instructions.

I’m assuming that you’re running these commands as root; therefore, I do not include the sudo command. Add this command if you are not running as root (standard disclaimer applies about not running as root unless you know what you’re doing).

Preparing the environment

In order to properly install PHP, we’ll need to prepare a number of dependencies.

I like to have support for Apache, MySQL and Postgres, so we’ll want to make sure and install those things so that PHP can find them:

aptitude install build-essential vim

aptitude install apache2 apache2-mpm-prefork apache2-prefork-dev apache2-utils apache2.2-common

aptitude install postgresql-9.1 postgresql-client-9.1 postgresql-client-common postgresql-common postgresql-server-dev-9.1

aptitude install mysql-client mysql-client-5.5 mysql-common mysql-server mysql-server-5.5 mysql-server-core-5.5 libmcrypt-dev curl openssl

Note that I’m also installing some additional libraries here: openssl, curl, libmcrypt-dev, and build-essential (which is necessary for make and make install).

Building the dependencies for PHP

There are a number of other dependencies that PHP will rely upon, so it’s important to build those as well. Lucky for us, we can use a single, simple command to build the dependencies that PHP will need:

apt-get build-dep php5

This command will fetch and build all the dependencies that PHP 5 relies upon. Bear in mind that you can skip this step and install the libraries yourself, if you so desire (or if you need a special configuration).

If you don’t run this command or install the required libraries, you’ll get all kinds of unpleasant errors from the PHP configure command.

Configuring and installing PHP

Once you’ve got the dependencies dealt with, it’s time to go forward and build PHP. Once you’ve downloaded PHP 5.5 (see for the latest RC1 build), untar it and change into that directory.

I like a pretty standard set of configuration options with my PHP installations. However, I do include a few unique settings that I will explain here:

  • –enable-opcache: this setting is new in PHP 5.5. The Zend Opcache was moved into PHP 5.5’s core, and this flag will enable the opcache when you compile PHP 5.5. The opcache is disabled by default.
  • –prefix=/opt/php: This prefix is used to tell the installer where to place the PHP files. I use /opt/php so that all the PHP files are stored in pretty much the same place. You can remove this and it will install the PHP files in the default locations on the operating system.
  • –with-config-file-path=/opt: I found in PHP 5.4 that if I didn’t specify this, PHP couldn’t find my INI file. You can remove this if you wish.
./configure --enable-opcache --prefix=/opt/php --with-apxs2=/usr/bin/apxs2 --with-mysql=mysqlnd --with-mysqli=mysqlnd --with-pgsql=/usr --with-tidy=/usr --with-curl=/usr/bin --with-openssl-dir=/usr --with-zlib-dir=/usr --with-xpm-dir=/usr --with-pdo-pgsql=/usr --with-pdo-mysql=mysqlnd --with-xsl=/usr --with-ldap --with-xmlrpc --with-iconv-dir=/usr --with-snmp=/usr --enable-exif --enable-calendar --with-bz2=/usr --with-mcrypt=/usr --with-gd --with-jpeg-dir=/usr --with-png-dir=/usr --with-freetype-dir=/usr --enable-mbstring --enable-zip --with-pear --with-libdir=/lib/x86_64-linux-gnu --with-config-file-path=/opt 

Once you have successfully run the ./configure command, you’ll need to run the make command to compile PHP.


After make is finished running, you’ll be prompted to run make test. If you’re compiling an unreleased version of PHP, do the community a favor and run these tests. Report any test failures you encounter. If you come across failures, run make clean and recompile.

After running make test, it’s time to install PHP. Run make install to install PHP to the destination you chose in configuration.

make install

Configuring Apache

When you install PHP from a package, it usually takes care of installing the required configuration in Apache. However, it has been my experience that I need to insert the correct information into Apache for Apache to recognize PHP files. This is the configuration I use in apache.conf:

<IfModule php5_module>
        AddType application/x-httpd-php .php
        AddType application/x-httpd-php .phps
        <IfModule dir_module>
                DirectoryIndex index.html index.php

Be sure and restart Apache after this is completed.

Cleaning up

PHP doesn’t automatically install an INI file, so you’ll want to do that. Note that there are two in the directory where you unpacked the tarball: php.ini-development, and php.ini-production. Select the correct configuration file for your server and copy it to the path you selected for the PHP INI directory.

You’ll need to add the location of your PHP binary to your path in order to run PHP from the command line; my PHP binary is in /opt/php/bin and this is in my path. Edit the ~/.profile file and add the following line:

export PATH=$PATH:/opt/php/bin

This will add the PHP binary to your path. You may also need to add the path of the PHP binary to your sudoers file. Run visudo as root and edit the secure path to include the correct location for the PHP binary directory.

In order to use the opcode cache in PHP 5.5, you’ll need to add to your php.ini file. You’ll also need to modify the opcache.enable=0 line to opcache.enable=1 (this was around line 1865 in my php.ini file).

  1. If you want a faster compile and don’t mind using up your CPU, “make -jX” will spawn multiple concurrent compile steps, where “X” = “CPU cores + 1”. Of course, you can use any integer there, so using “1 <= X <= CPU cores + 1" can give you a range to choose from. I picked up the "+1" piece back in my Gentoo days, so I don't know exactly why to add it… I just trusted that the Gentoo folks knew what they were doing ;-)

    This can also speed up the test step: "make -j5 test"

  2. Hi Brandon Savage,

    I follow your post and build my LAMP successful. But, openssl don’t active so I cannot send email by gmail smtp. When I check php info, not openssl extension. Can you help me?
    This is my php info
    php -m
    [PHP Modules]
    Zend OPcache

  3. Hello

    I have the same problem to use openssl extension

    I have this message when i want to install dependancies of symfony 2 with composer :

    [RuntimeException] You must enable the openssl extension to download files via https

    In phpinfo :
    OpenSSL support => disabled (install ext/openssl)

    did you find a solution at this problem since your last message ?

  4. For OpenSSL support you need to install libcurl4-openssl-dev first:

    aptitude install libcurl4-openssl-dev

  5. Errors, errors, errors. Seriously, best PHP 5.5 setup post so far, but fails on Ubuntu 12.04 LTS (like all other tutorials). What distro have you used ? What have you done before ? What’s in your sources.list ? What kind of “source URIs” do i need in my sources.list ? Why is PHP make always failing with “xml2 dependencies”. Thanks for your effort to write this tutorial, but this does not really work out of the box. :(

    Why is it so goddam hard to use linux ? I’m going to bed now and cry a little bit.

Comments are closed.