Como compilar PHP 5.3.xx en Ubuntu 16.04

La última versión publicada de php 5.3, dejo de tener soporte oficial el 14 de agosto del 2014, por lo tanto se tienen que actualizar a una versión estable, pero en el mundo real esto no pasa a menudo, por lo cual tengo la necesidad de instalar php 5.3 en el ultimo LTS de Ubuntu, para seguir soportando las aplicaciones legacy.

Para poder realizar esta tarea; me di a la tarea de tratar de correr php 7 y 5.3 en el mismo server, para esta actividad es necesario que ambos corran en fpm asi como apache en modo proxy para que pueda hacer las llamadas a los php segun se desee.

NOTA: Este post no hablara de como instalar php7, ya que hay muchos lugares donde se puede consultar esta información.

Primero lo que necesitamos hacer es instalar apache y algunos modulos

sudo apt-get install -y apache2

Después activamos los modulos de proxy y proxy_cgi

a2enmod proxy proxy_fcgi

Reiniciamos el servicio

sudo service apache2 restart

Instalamos los paquete de desarrollo para poder compilar php.

apt-get install -y  git autoconf lynx wget build-essential libxml2-dev libssl-dev libbz2-dev libcurl4-openssl-dev  libpng12-dev libfreetype6-dev libxpm-dev libmcrypt-dev libmhash-dev libmysqlclient-dev libjpeg62-dev freetds-dev libjson-c-dev re2c libfcgi-dev libfcgi0ldbl libjpeg62-dbg libmcrypt-dev libssl-dev libc-client2007e libc-client2007e-dev libfcgi-dev libfcgi0ldbl libjpeg62-dbg libmcrypt-dev libssl-dev libc-client2007e libc-client2007e-dev mysql-server mysql-client 

ln -s /usr/lib/libc-client.a /usr/lib/x86_64-linux-gnu/libc-client.a

Creamos una carpeta para guardar las fuentes de php 5.3

mkdir /opt/source

Descargamos el código fuente de php 5.3

wget http://br2.php.net/get/php-5.3.29.tar.gz/from/this/mirror -O php-5.3.29.tar.gz

Descomprimimos el paquete

tar -zxvf php-5.3.29.tar.gz
cd php-5.3.29.tar.gz

Procedemos a hacer la configuración

./configure  --prefix=/opt/source/php-5.3.29 --with-zlib-dir --with-freetype-dir --enable-mbstring --with-libxml-dir=/usr --enable-soap --enable-calendar --with-curl --with-mcrypt --with-zlib --with-gd  --disable-rpath --enable-inline-optimization --with-bz2 --with-zlib --enable-sockets --enable-sysvsem --enable-sysvshm --enable-pcntl --enable-mbregex --with-mhash --enable-zip --with-pcre-regex --with-mysql=mysqlnd  --with-pdo-mysql=mysqlnd  --with-mysqli=mysqlnd  --with-jpeg-dir=/usr --with-png-dir=/usr --enable-gd-native-ttf --with-openssl --with-fpm-user=www-data --with-fpm-group=www-data --with-libdir=/lib/x86_64-linux-gnu --enable-ftp --with-gettext --enable-fpm

Ahora compilamos e instalamos php, esto puede tardar un poco dependiendo del servidor.

make 

Al terminar de compilar nos debe de aparecer algo similar.

Procedemos a instalar

make install

Al terminar nos mostrara una pantalla similar a

De aquí cabe resaltar que php 5.3 esta instalado en la siguiente ruta /opt/source/php-5.3.29. por lo que tenemos que hacer referencia a esta ruta para poder ejecutar php desde consola.

Antes de probar PHP en apache debemos de agregar los archivos de php.ini, asi como el archivo de configuración de fpm.

cp php.ini-production /opt/source/php-5.3.29/lib/php.ini

Ahora podemos probar el php en modo consola dado como resultado la versión compilada

Copiamos el archivo de configuración de fpm, asi como el archivo para controlar el demonino de php-fpm

cp /opt/sources/php-5.3.29/sapi/fpm/php-fpm.conf /opt/source/php-5.3.29/etc/
cp /opt/sources/php-5.3.29/sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
chmod +x /etc/init.d/php-fpm

Lo agregamos al inicio de sistema e iniciamos el demonio

update-rc.d php-fpm defaults
service php-fpm start

Lo comprobamos con ss -tulpn |grep php.

Podemos observar que esta corriendo por el puerto 9000

Por lo que podemos ya hacer pruebas con apache. Para esto editamos el archivo de 000-default, ubicado en etc/apache2/sites-enable.

Agregamos la siguiente línea al archivo

<VirtualHost *:80>
        # The ServerName directive sets the request scheme, hostname and port that
        # the server uses to identify itself. This is used when creating
        # redirection URLs. In the context of virtual hosts, the ServerName
        # specifies what hostname must appear in the request's Host: header to
        # match this virtual host. For the default virtual host (this file) this
        # value is not decisive as it is used as a last resort host regardless.
        # However, you must set it for any further virtual host explicitly.
        #ServerName www.example.com

        ServerAdmin [email protected]
        DocumentRoot /var/www/html

        # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
        # error, crit, alert, emerg.
        # It is also possible to configure the loglevel for particular
        # modules, e.g.
        #LogLevel info ssl:warn

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        # For most configuration files from conf-available/, which are
        # enabled or disabled at a global level, it is possible to
        # include a line for only one particular virtual host. For example the
        # following line enables the CGI configuration for this host only
        # after it has been globally disabled with "a2disconf".
        #Include conf-available/serve-cgi-bin.conf

        <FilesMatch \.php$>
              SetHandler "proxy:fcgi://127.0.0.1:9000"
        </FilesMatch>


</VirtualHost>

Guardamos los cambios y hacemos un reload a apache.

Creamos phpinfo.php en la ruta /var/www/html/ con el siguiente código.

<?php

phpinfo();
?>

Guardamos y probamos en el explorardor si ya funciona php en apache. Si todo sale bien debe de aparecer una pagina similar a esta.

Listo hemos terminado.

Ernesto Sánchez Benitez

Ernesto Sánchez Benitez