PHP 5.5.0 and Apache 2.4.4 on CentOS 6.4

In June of 2013, PHP 5.5.0 was released as suitable for production use.  Our internal site used Apache httpd and MediaWiki to test PHP 5.5.0.  Our OS was CentOS 6.4 (64-bit).

We compiled PHP 5.5.0 from scratch, with all the prerequisite packages downloaded and installed, using the following configuration:

#! /bin/sh
#
# Created by configure

'./configure' \
'--enable-intl' \
'--enable-cgi' \
'--with-apxs2=/opt/apache/bin/apxs' \
'--with-pear' \
'--with-libdir=lib64' \
'--with-curl=shared' \
'--with-openssl=shared' \
'--prefix=/opt/php5' \
'--with-gdbm=shared' \
'--enable-dba=shared' \
'--with-db4=shared' \
'--enable-ftp' \
'--with-gd=shared' \
'--with-imap=shared' \
'--with-kerberos=/usr' \
'--with-imap-ssl=shared' \
'--enable-sockets' \
'--enable-zip' \
'--with-jpeg-dir=/usr' \
'--with-png-dir=/usr' \
'--with-xpm-dir=/usr' \
'--with-zlib' \
'--with-zlib-dir=/usr' \
'--with-bz2=shared' \
'--enable-exif' \
'--enable-soap' \
'--with-gmp' \
'--with-mcrypt=/usr/local' \
'--with-mhash' \
'--enable-mbstring' \
'--with-mysql=mysqlnd' \
'--with-mysqli=mysqlnd' \
'--with-pdo-mysql=mysqlnd' \
'--with-snmp=shared' \
'--enable-wddx' \
'--enable-pcntl' \
'--with-xmlrpc=shared' \
'--with-xsl=shared' \
'--with-ldap=shared' \
'--with-ldap-sasl' \
'--with-libedit' \
'--with-readline' \
'--with-pgsql=/usr/local/pgsql/bin/pg_config' \
'--with-pdo-pgsql=/usr/local/pgsql/bin/pg_config' \
"[email protected]"

The configuration above assumed the following:

Other packages which were required by PHP were installed from either the official CentOS yum repository or from each package’s respective official source.

[GARD align=”center”]

The above configure script was saved as config-php.sh and placed above the PHP source directory.  The following commands were issued to start compiling and testing PHP:

cd php-5.5.0
../config-php.sh
make
make test

After the PHP tests were completed, the results were installed in /opt/php5:

sudo make install

In our setup, we used mod_fcgid to execute PHP scripts. See the previous article on installing PHP 5.4 for more information.

To verify that PHP is configured correctly, create a PHP script that contains the following:

<?php

phpinfo();

?>

The above script should generate something similar to this:
PHP Info

As you scroll down, you’ll see more information about the features of your particular PHP installation.

Remember to edit /opt/php/lib/php.ini to set certain variables properly. Here’s a sample php.ini file:

; Choose your preferred time zone and set it here
date.timezone = UTC

; Load extensions (see /opt/php5/lib/php/extensions)
; that you need.
extension = bz2.so
extension = curl.so
extension = dba.so
extension = gd.so
extension = imap.so
extension = ldap.so
extension = openssl.so
extension = snmp.so
extension = xmlrpc.so
extension = xsl.so

You should see information about these extensions in the phpinfo() output.

PHP 5.4 Configuration For Apache 2.4

PHP 5.4 InfoIn one of the systems we manage, we are running Apache httpd 2.4 with PHP and mod_fcgid.  We configure PHP 5.4 for compilation using this script:

#! /bin/sh
#
# Created by configure

'./configure' \
'--enable-intl' \
'--enable-cgi' \
'--enable-fpm' \
'--with-apxs2=/opt/apache/bin/apxs' \
'--with-fpm-user=daemon' \
'--with-fpm-group=daemon' \
'--with-pear' \
'--with-libdir=lib64' \
'--with-curl=shared' \
'--with-openssl=shared' \
'--prefix=/opt/php5' \
'--with-gdbm=shared' \
'--enable-dba=shared' \
'--with-db4=shared' \
'--enable-ftp' \
'--with-gd=shared' \
'--with-imap=shared' \
'--with-kerberos=/usr' \
'--with-imap-ssl=shared' \
'--enable-sockets' \
'--enable-zip' \
'--with-jpeg-dir=/usr' \
'--with-png-dir=/usr' \
'--with-xpm-dir=/usr' \
'--with-zlib' \
'--with-zlib-dir=/usr' \
'--with-bz2=shared' \
'--enable-exif' \
'--enable-soap' \
'--with-mcrypt=/usr/local' \
'--with-mhash' \
'--enable-mbstring' \
'--with-mysql=mysqlnd' \
'--with-mysqli=mysqlnd' \
'--with-pdo-mysql=mysqlnd' \
'--with-snmp=shared' \
'--enable-wddx' \
'--with-xmlrpc=shared' \
'--with-xsl=shared' \
'--with-ldap=shared' \
'--with-ldap-sasl' \
"[email protected]"

The above configuration is valid as long as the requisite software and libraries are installed. For our CentOS system, we use yum (which uses rpm) to install these software and libraries.

After running the above script to configure the PHP source, we compile and install PHP:

make
make test
sudo make install

Note that our PHP configuration for compilation lets us generate a command-line PHP binary (php), a FastCGI PHP binary (php-cgi), a FastCGI Process Manager-enabled binary (php-fpm) and an Apache httpd 2 module (libphp5.so).

As for the existing Apache httpd 2.4 installation, we configure /etc/opt/apache/httpd.conf to make use of php-cgi through mod_fcgid:

# Make sure mod_fcgid is enabled above.
# libphp5.so must be disabled.
# PHP5.4 - FCGI
<IfModule fcgid_module>
    <FilesMatch \.php$>
        AddHandler fcgid-script .php
        Options +ExecCGI
        FcgidWrapper /opt/php5/bin/php-wrapper  .php
    </FilesMatch>
</IfModule>

Now, /opt/php5/bin/php-wrapper is simply this script:

#!/bin/bash

PHP_FCGI_MAX_REQUESTS=10000
export PHP_FCGI_MAX_REQUESTS

# Disable PHP child process management. Let mod_fcgid
# handle it
PHP_FCGI_CHILDREN=0
export PHP_FCGI_CHILDREN 

exec /opt/php5/bin/php-cgi [email protected]

The above script is based on an example in http://httpd.apache.org/mod_fcgid/mod/mod_fcgid.html#examples.

Be aware that, with the FilesMatch directive above, access controls applied to PHP files may get a bit tricky. Take note of the order of directives and refer to the Apache httpd 2.4 documentation for tips and for more information. See http://httpd.apache.org/docs/2.4/howto/access.html for example.