Pueden existir ocasiones en las que necesites ejecutar diferentes versiones de PHP en un único servidor Apache. Los motivos pueden ser muy variados: necesitas varios entornos de desarrollo, tienes que servir algún servicio web que requiere una versión antigua de PHP o simplemente quieres pasar una mañana de domingo. 🙂 Me gustaría explicar en este post cómo utilizar PHPFarm como una alternativa para implementar en Apache varias versiones de PHP.

Si eres programador existen otras alternativas más simples de implementar, como Vagrant que permiten de modo más sencillo reproducir un entorno de desarrollo. Si te interesa esta opción te recomiendo el post de Alejandro Celaya Setting up a PHP development environment with Vagrant.

También es interesante el proyecto Docker al cual espero poder dedicarle más tiempo.

PHPFarm

Este desarrollo permite descargar, configurar e instalar diferentes versiones de PHP para posteriormente ejecutar en un servidor web como CGI. Efectivamente no es una solución perfecta dado que la ejecución como CGI es mucho menos eficiente que ejecutarlo como módulo en Apache. Sin embargo en algunos escenarios podría ser una solución aceptable.

En esta entrada intentaré explicar cómo instalarlo en Debian, resolviendo algunas de las dificultades que me he encontrado a lo largo de la instalación basándome en los tutoriales existentes en la red.

Obteniendo copia del proyecto

Podremos encontrar PHPFarm en su repositorio de GitHub. Yo he utilizado el proyecto original aunque como cualquier desarrollo de éxito cuenta con otras ramas de desarrollo como esta, mucho más actualizada.

Preparando el sistema

Dado que vamos a necesitar compilar desde la fuente original de PHP es necesario que instalemos las herramientas necesarias en nuestro sistema para compilar, por lo que como root (o con sudo) ejecutaremos el siguiente comando:

apt-get build-essential

Lo siguiente será conseguir las librerías que necesita PHP5 en su ejecución y resolver las dependencias, para lo cual lanzaremos el siguiente comando:

apt-get build-dep php5

Por último descargaremos el proyecto PHPFarm de GitHub. Como ya dije antes, yo me he descargado el proyecto general, pero podéis experimentar con otros. Yo lo he instalado en el directorio /opt/phpfarm.

git clone https://github.com/cweiske/phpfarm.git /opt/phpfarm

Preparando las opciones de compilación

En este momento ya podemos entrar en el directorio /opt/phpfarm/src/ y preparar las opciones de configuración de la versión de PHP que nos interese. Este paso simplemente consiste en crear en dicho directorio un fichero custom-options.sh con las opciones que necesites. No edites ninguno de los ficheros existentes.

Por ejemplo: un archivo llamado custom-options.sh se aplicará a todos las versiones de PHP que compilemos. El fichero custom-options-5.sh se aplicará a todas las versiones de PHP 5.xx. Un fichero custom-options-5.3.sh sólo se aplicará a las versiones de PHP 5.3 y así sucesivamente.

En mi caso necesito, aparte de la última versión en producción, las versiones 5.2 y 5.3, por lo que generé dos ficheros distintos con las opciones más comunes de compilación:

custom-options-5.2.sh

configoptions="
        -enable-cli 
        -with-pear 
        -with-iconv 
        -with-curl 
        -with-mysqli 
        -enable-mbstring 
        -enable-exif 
        -with-jpeg-dir=/usr 
        -with-zlib 
        -with-zlib-dir 
        -with-png-dir=/usr 
        -with-gd 
        -with-gettext 
        -enable-gd-native-ttf 
        -with-mhash 
        -enable-ftp 
        -with-pspell 
        -with-mcrypt 
        -enable-bcmath 
        -with-mime-magic 
        -with-pdo-mysql 
        -enable-sockets 
        -enable-soap 
        -enable-calendar 
        -enable-fastcgi 
        -enable-force-cgi-redirect 
"

Por cierto, desactive el soporte para SSL e PHP 5.2 dado que existía una grave incompatibilidad entre Debian Wheezy y esta versión. Por defecto Debian no implementa soporte para SSLv2 por seguridad y 5.2 se basaba en dicha versión. Si alguien lo necesita realmente necesitará compilar también los fuentes de Debian de la librería OpenSSL.

Para la versión 5.3 sí que mantuve el soporte para OpenSSL y también como en los tutoriales incluí soporte para librerías de manipulación de gráficos.

custom-options-5.3.sh

configoptions="
        -with-mysqli=mysqlnd 
        -with-pdo-mysql=mysqlnd 
        -with-openssl=/usr 
        -enable-cli 
        -with-pear 
        -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
"

Es hora de compilar

Una vez configuradas las distintas versiones a compilar es hora de lanzar el proceso. Puede tardar algún tiempo, como ya sabrás si tienes experiencia anterior con compilaciones. Para lanzar el proceso utiliza la siguiente sintaxis con la versión a descargar y compilar:

./compile.sh 5.2.29

No es fácil que funcione a la primera, así que anota los errores que puedan aparecer en el proceso y busca en Internet. Generalmente suelen ser problemas de dependencias no resueltas o ficheros que no localiza. Según la distro que utilices puede dar problemas de compilación a la hora de localizar los ficheros. Yo lo resolví por medio de enlaces simbólicos:

libJPEG

ln -s /usr/lib/x86_64-linux-gnu/libjpeg.so /usr/lib/
ln -s /usr/lib/x86_64-linux-gnu/libjpeg.a /usr/lib/

libPNG

ln -s /usr/lib/x86_64-linux-gnu/libpng.a /usr/lib/
ln -s /usr/lib/x86_64-linux-gnu/libpng.so /usr/lib/

OpenSSL

ln -s /usr/lib/x86_64-linux-gnu/libssl.a /usr/lib/
ln -s /usr/lib/x86_64-linux-gnu/libssl.so /usr/lib/
ln -s /usr/lib/x86_64-linux-gnu/libsslcommon.so /usr/lib/
ln -s /usr/lib/x86_64-linux-gnu/libssl3.so /usr/lib/
ln -s /usr/lib/x86_64-linux-gnu/libssl3.a /usr/lib/
ln -s /usr/lib/x86_64-linux-gnu/libsslcommon.so.2 /usr/lib/

Una vez finalice el proceso podremos comprobar que en el directorio /opt/php-farm/inst hemos generado los binarios y librerías necesarias de la versión PHP compilada. Es aquí donde vincularemos Apache para ejecutar una u otra versión como CGI.

Una vez hayas generado las distintas versiones que necesitas es el momento de configurar Apache.

Configurando Apache con FastCGI

Suponemos que ya tienes funcionando Apache con una configuración más o menos básica. Es importante tener en cuenta que si tienes instalado PHP5 como módulo ignorará las operaciones que realicemos para ejecutar otras versiones como CGI. Sin embargo, podemos seguir conservando PHP como módulo si en cada entorno VirtualHost que queramos ejecutar una versión como CGI incluyamos las siguientes lineas para desactivar el engine.

<ifmodule mod_php5.c>
php_flag engine off
</ifmodule>

Si no tienes instalado en Apache el módulo FastGI podremos añadirlo y activarlo con:

apt-get install libapache2-mod-fastcgi &amp;&amp; a2enmod fastcgi

El siguiente paso necesario es configurar FastCGI para que funcione en Apache y ejecute las diferentes versiones de PHP. Para ello añadiremos un el fichero /etc/apache2/conf.d/php-cgisetup.conf con el siguiente contenido, donde además podemos parametrizar la ejecución de PHP:

php-cgisetup.conf

FastCgiServer /var/www/cgi-bin/php-cgi-5.2.17 -idle-timeout 240 
FastCgiServer /var/www/cgi-bin/php-cgi-5.3.29 -idle-timeout 240
ScriptAlias /cgi-bin-php/ /var/www/cgi-bin/

Como vemos hemos en la configuración de FastCGI hacemos referencia a dos ficheros ubicados en /var/www/cgi-bin/ que es donde definiremos la ejecución a las librerías de PHP que tenemos instaladas en /opt/phpfarm. Así pues creemos en /var/www/cgi-bin/ los ficheros que necesitamos para ejecutar PHP.

php-cgi-5.2.17

#!/bin/sh
PHP_FCGI_CHILDREN=3 
export PHP_FCGI_CHILDREN 
PHP_FCGI_MAX_REQUESTS=5000 
export PHP_FCGI_MAX_REQUESTS 
exec /opt/phpfarm/inst/bin/php-cgi-5.2.17

php-cgi-5.3.29

#!/bin/sh
PHP_FCGI_CHILDREN=3 
export PHP_FCGI_CHILDREN 
PHP_FCGI_MAX_REQUESTS=5000 
export PHP_FCGI_MAX_REQUESTS 
exec /opt/phpfarm/inst/bin/php-cgi-5.3.29

Un punto importante es que debemos de asegurarnos que el el usuario de Apache tenga permisos de ejecución y sea el propietario del directorio /var/www/cgi-bin/, para evitar problemas de ejecución. Así que nos aseguraremos de que así sea:

chown www-data.www-data /var/www/cgi-bin/ -R &amp;&amp;
chmod 750 /var/www/cgi-bin/ -R

Configurando VirtualHosts

El siguiente paso una vez listo y configurado el módulo FastCGI podemos configurar un VirtualHost en Apache para ejecutar PHP como CGI. Suponiendo que tengamos definido un site php52.local podemos configurar el site con el siguiente fichero:

php52.conf

<Virtualhost *:80>
<ifmodule mod_php5.c>
php_flag engine off
</ifmodule>
ServerName php52.local
DocumentRoot /var/www/php52 
<Directory />   
Options FollowSymLinks   
AllowOverride All   
AddHandler php-cgi .php   
Action php-cgi /cgi-bin-php/php-cgi-5.2.17 
</Directory>
ErrorLog /var/log/apache2/error.log 
LogLevel warn 
CustomLog /var/log/apache2/access.log combined  
</VirtualHost>

Supongamos que hemos preparado dos Virtualhost, uno para cada versión de PHP que hemos compilado, 5.2 y 5.3. Una vez activados los sites en sus correspondientes dominios locales podremos entraa a cada uno de ellos y obtener una captura como la siguiente:

php-farm-apache-cgi

 

Como hemos visto al ejecutar como CGI la librería PHP con la ayuda de PHPFarm nuestro servidor Apache podrá utilizar distintas versiones de PHP en el mismo servidor. Espero que os resulte útil en alguna ocasión.

Fuentes

PHPFarm – 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 PHP

Comparte si te ha gustado

Autor:
Última actualización:

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.