Revista Tecnología

Instalar múltiples versiones de PHP y extensiones con phpfarm en Ubuntu/Mint/Debian…

Publicado el 06 junio 2016 por Gaspar Fernández Moreno @gaspar_fm

Instalar múltiples versiones extensiones phpfarm Ubuntu/Mint/Debian…Instalar múltiples versiones de PHP y extensiones con phpfarm en Ubuntu/Mint/Debian…
Si llevas varios años trabajando con este lenguaje de programación. Tal vez se te ha presentado un pequeño problema: tienes varios desarrollos a lo largo del tiempo y tienes código en una versión de PHP antigua que no es compatible con versiones nuevas. Y, por otro lado, mientras mantienes una versión de producción de otro proyecto (para PHP 5.5 o PHP 5.6), quieres empezar a hacer pruebas para ver cómo se comporta con PHP7, y todo ello sin morir en el intento.

En mi día a día, muchas veces me enfrento a esa situación. Hay programas que no voy a tocar nunca, ni estoy dispuesto a ello, hechos con versiones antiguas de PHP y que ahora mismo están corriendo en PHP 5.3 sin problema. Son programas de esos que el día que me ponga con ellos, los quiero reescribir enteros, y lo voy dejando, lo voy dejando... aunque en ocasiones necesitan un arreglo (¡ no, un array no ! Un arreglo, de arreglar, o bueno, reparación, parche...) y tengo que poder ejecutarlos en local.

Entonces, en necesito constantemente en mi ordenador tres versiones instaladas, PHP 5.3, PHP 5.5 y PHP 7. Una solución puede ser crear máquinas virtuales o usar vagrant para cada uno de los proyectos. Aunque por un lado puedo desactivar máquinas y olvidarme de ellas cuando no están, incluso tenerlas en un disco duro externo para que no estén ocupando, por otro lado, necesito replicar varias veces un software que ya tengo (sistema operativo, servidor web, bibliotecas de sistem, etc), y todo esto consume disco, memoria y procesador cuando está cargado. Podría utilizar tecnologías como LxC o docker para utilizar en local estos servidores.

Yo opté por utilizar phpfarm y, aunque es un proyecto antiguo, hace lo que tiene que hacer: nos proporciona un entorno en el que compilar y utilizar distintas versiones de PHP de forma razonablemente fácil. Incluso se defiende bien para compilar las últimas versiones de PHP sin problemas.

Aunque los siguientes pasos puedan parecer muy complejos, lentos y costosos si no estás acostumbrado a compilar software en tu ordenador, es más sencillo de lo que parece. Esta instalación la he hecho en Linux Mint 17.3 Rosa, aunque debería funcionar sin problemas en Ubuntu y en Debian (si no tienes sudo, hazte root y quita el sudo).

Preparando el entorno para compilar PHP

Si has compilado algo anteriormente, seguramente ya tendrás instaladas las build-essential, pero para instalarlas:

$ sudo apt-get build-essential

Ahora, vamos a instalar algunas dependencias para compilar PHP, serán algunas bibliotecas que se requieren para poder realizar la compilación con éxito. Bueno, también he incluido git, ya que descargaremos phpfarm desde su repositorio de github

$ sudo apt-get build-dep php5
$ sudo apt-get install libmcrypt-dev libc-client2007e-dev git

Como servidor web voy a utilizar Apache 2.4 en modo CGI ( podemos utilizar otras opciones), para ello debemos instalar también:

$ sudo apt-get install libapache2-mod-fcgid

Y activarlo

$ sudo a2enmod fcgid

Instalando phpfarm

Ahora clonamos el repositorio desde github. Yo lo he copiado todo en /opt/ (hace mucho que vi en una guía que alguien lo instalaba ahí y me gustó la idea, en lugar de hacerlo en un directorio de usuario). Así que todo lo que queda de tutorial lo haremos desde esa carpeta.

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

Los siguientes pasos se repetirán para cada una de las instalaciones que vayamos a hacer de PHP. Por lo que, para esta primera instalación lo pondré con más detalle, en las siguientes instalaciones iré un poco más rápido.

Configurando y compilando PHP

A mí me gusta hacer una configuración individual por cada versión de PHP que instalo, o al menos, hasta la versión menor. Por ejemplo, uno para PHP5.3, otro para PHP5.5 y otro para PHP7.0, a lo mejor necesitamos llegar hasta la revisión en alguna instalación puntual (5.5.19), pero bueno, tenemos la opción. Esta configuración irá en un archivo llamado custom-options.sh dentro de /opt/phpfarm/src . Si queremos:

  • Una configuración global para todas las compilaciones de PHP, utilizaremos custom-options.sh
  • Una configuración para todo lo que sea PHP 5 (5.1, 5.2, 5.3, ...) usaremos custom-options-5.sh
  • Una configuración para todos los PHP 5.3 (5.3.1, 5.3.2, 5.3.10, ...) usaremos custom-options-5.3.sh
  • Una configuración particular para una revisión en concreto (5.3.19) usaremos custom-options-5.3.19.sh

Además, este archivo no tiene por qué tener permiso de ejecución. En este archivo incluiremos las opciones que vamos a pasarle al configure de PHP. Es decir, los diferentes elementos a los que daremos soporte en nuestra compilación. Muchos serán los módulos que se incluirán (por ejemplo exif, gd, mbstring, ttf, openssl, pear...), un poco más adelante os diré cómo averiguar las diferentes opciones que soporta una versión de PHP. En este caso crearemos custom-options-5.3.sh con el siguiente contenido (delante de cada enable y cada with hay dos guiones seguidos - -):

Una opción interesante puede ser activar "-enable-fpm" si queremos configurar nuestro servidor con este soporte (experimental en 5.3), pero nos permitirá correr servidores de PHP que luego se podrán comunicar con nuestro servidor web.

El siguiente paso es compilar la versión de PHP que queremos. Para ello, nos situamos dentro de /opt/phpfarm/src y ejecutamos:

$ sudo ./compile 5.3.29

Esto trabajará solo un rato. Él sólo se descarga la versión elegida de PHP desde varias fuentes (según esté disponible), hace el configure, make y lo pone todo en su sitio. Normalmente si hemos seguido las instrucciones, debería terminar sin problemas. Aunque si os da algún problema debemos leer bien el error de la compilación. Muchas veces si buscamos el error en Internet nos dirá cómo solucionarlo, porque puede que nos falte alguna biblioteca por instalar o que haya algo mal escrito en el archivo custom-options.sh, aunque os animo a escribir un comentario con el fallo que os da a ver si entre todos lo podemos arreglar.

Configurar Apache

Ya tenemos la versión instalada. En este punto, de cara al servidor web, ya que haremos la configuración con CGI, crearemos dentro de /opt/phpfarm el directorio cgi-bin:

$ mkdir cgi-bin

y allí crearemos un archivo llamado php-5.3 (como root). Y, con un editor de texto (nano, gedit, vi, emacs...) añadiremos el siguiente contenido:

Si os fijáis, en la última línea ponemos la ruta del archivo ejecutable de php-cgi correspondiente a la versión que queremos configurar. Ahora configuraremos el VirtualHost de Apache añadiendo las siguientes líneas ( ir a esta web para ver un virtualhost completo):
En el vhost incluir:

Tras esto, sólo queda recargar la configuración de Apache:

$ sudo service apache2 reload

Ejecutable para PHP en línea de comandos

Esto será un simple enlace en /usr/local/bin (debemos asegurarnos de tener esta ruta en nuestro PATH, para ello, en consola podemos hacer $ echo $PATH). Con esto vamos a hacer que la ejecución de php-5.3 sea global en nuestro sistema:

$ sudo ln -s /opt/phpfarm/inst/php-5.3.29/bin/php /usr/local/bin/php-5.3

De la misma manera podemos crear enlaces a los diferentes ejecutables que hay en ese directorio.

Si además queremos que al ejecutar php (a secas, a nivel de sistema) se haga con esta versión:

$ sudo ln -s /opt/phpfarm/inst/php-5.3.29/bin/php /usr/local/bin/

Instalando APC con PECL

Una extensión que suele usarse mucho es APC como caché de código y datos. Y suele ser obligatoria en muchos scripts. Para instalarla, iremos a /opt/phpfarm/inst/php-5.3.29/bin/ y ejecutaremos:

$ sudo pecl install apc

Esto nos hará varias preguntas para configurar la extensión (podemos decir que sí a todo, o darle a enter), normalmente no suele haber problemas si la versión del módulo no es muy antigua.

Luego editamos /opt/phpfarm/inst/php-5.3.29/lib/php.ini e incluimos al final:

Instalando otras versiones de PHP

Yo instalo también otra versión la 5.5.35, para ello creo un custom-options-5.5.sh con un contenido muy parecido al anterior (eliminamos -with-pecl porque ya viene incluido y este flag no se reconoce):

Compilamos como antes:

$ ./compile 5.5.35

Cuando termine el proceso, instalamos APCU (nueva versión con compatibilidad con APC). Debemos asegurarnos de instalar la versión 4.0.10 que es la última compatible con PHP5.5:

$ sudo ./pecl install apcu-4.0.10

De la misma manera al final del fichero /opt/phpfarm/inst/php-5.5.35/lib/php.ini incluimos:

De la misma manera, podemos configurar el VirtualHost que trabajará con PHP5.5 creando un lanzador en /opt/phpfarm/cgi-bin/php-5.5 y cambiando la ruta también en Apache, además, crear los enlaces a php-5.5 en /usr/local/bin.

Instalando PHP7

Por el momento, las opciones de compilación de PHP7 pueden ser las mismas que para PHP5.5, incluso podemos hacer:

$ sudo ./compile 7.0.6

sin problema (la 7.0.6 es la última versión estable a día de hoy, y no descarto que tengamos que modificar el custom-options.sh para futuras versiones). La configuración del virtualhost y los enlaces, todo se mantiene de forma similar a como veníamos haciéndolo hasta ahora.

Versiones de PHP que no se pueden descargar

Tal vez queramos instalar una versión antigua, o muy nueva (una RC por ejemplo), que ya no (o todavía no) está en los repositorios oficiales de PHP. Lo que podemos hacer es descargarla a mano en formato tar.bz2 y darle el siguiente nombre:

php-version.tar.bz2

Ese archivo lo copiamos en /opt/phpfarm/src/bzips luego podemos hacer el ./compile [version] como hasta ahora. Todo lo demás se mantendría igual.

Experimentos y otros detalles

Experimentar con las configuraciones

Ahora llega el momento de jugar. Por ejemplo, ¿ qué otras opciones podemos darle a PHP para compilar? Esas famosas opciones para el configure. En esta guía, he puesto algunas opciones genéricas que en mi caso funcionan bien, pero tal vez necesites un módulo adicional, o soporte para alguna tecnología que utilizas. Para ello, viene bien saber todo lo que hay disponible. Eso lo podemos averiguar si después del ./compile estamos atentos y paramos el proceso (Control-C) una vez descomprimido el archivo descargado (si dejamos que se compile todo, simplemente tardaremos más). Una vez parado el proceso entramos en /opt/phpfarm/src/php-5.5.35 (o la versión que queramos) y allí ejecutamos:

$ ./configure -help

Será muy largo, por lo que tal vez quieras paginarlo con less o more:

$ ./configure -help | less

Esto implicará mucha lectura por tu parte para saber qué es cada cosa. Muchas veces, requerirá algo de búsqueda por Internet y, tal vez sea necesario instalar alguna biblioteca en el sistema antes de poder compilar. De todas formas, os animo a probar y a comentar vuestras configuraciones propias.

Varias versiones para un mismo proyecto

Puede que un proyecto ejecute normalmente con PHP5.5, pero que para ciertas operaciones intensivas utilice PHP7.0, es sencillo, podemos configurar el VirtualHost para que dos directorios diferentes utilicen versiones diferentes de PHP. Será Apache el que se encargue de hacer el cambio.

Cambiar la versión de PHP en consola

Para consola, podemos crear un enlace de la siguiente manera:

$ sudo ln -s /opt/phpfarm/inst/current-bin /usr/local/bin/php

y

$ sudo ln -s /opt/phpfarm/inst/switch-phpfarm /usr/local/bin/

De esta forma, podremos ejecutar:

$ sudo switch-phpfarm

y ver las versiones disponibles, y del mismo modo:

$ sudo switch-phpfarm 5.5.35

Para hacer que el ejecutable php a nivel de sistema sea el de la versión 5.5 (y cambiar de versión cuando queramos).

Foto principal: Evelyn Paris


También podría interesarte :

Volver a la Portada de Logo Paperblog

Quizás te interesen los siguientes artículos :

Revista