Publi

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

photo-1441749074938-1c6782303919
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 – -):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# You can override config options very easily.
# Just create a custom options file; it may be version specific:
# - custom-options.sh
# - custom-options-5.sh
# - custom-options-5.3.sh
# - custom-options-5.3.1.sh
#
# Don't touch this file here - it would prevent you to just "svn up"
# your phpfarm source code.

configoptions="\
--enable-bcmath \
--enable-calendar \
--enable-exif \
--enable-ftp \
--enable-gd-native-ttf \
--enable-mbstring \
--enable-pcntl \
--enable-soap \
--enable-sockets \
--enable-wddx \
--enable-zip \
--enable-sysvshm \
--enable-sysvsem \
--enable-sysvmsg \
--enable-cgi \
--with-openssl \
--with-zlib \
--with-pear \
--with-pecl \
--with-gettext \
--with-imap \
--with-imap-ssl \
--with-kerberos \
--with-pdo-mysql \
--with-mysqli \
--with-mysql \
--with-curl \
--with-gd \
--with-jpeg-dir=/usr/lib \
--with-mcrypt"

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:

1
2
3
4
5
6
7
#!/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

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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        <Directory /home/usuario/webs/miweb53/>
                Options +Indexes +FollowSymLinks -MultiViews +ExecCGI
                AddHandler php-cgi .php
                AllowOverride All
                AddHandler fcgid-script .php .php5 .phtml
                FcgidWrapper /opt/phpfarm/cgi-bin/php-cgi-5.3 .php
                FcgidWrapper /opt/phpfarm/cgi-bin/php-cgi-5.3 .php5
                FcgidWrapper /opt/phpfarm/cgi-bin/php-cgi-5.3 .phtml
                Require all granted
        </Directory>
        <Directory "/opt/phpfarm/cgi-bin">
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                AllowOverride None
                Require all granted
        </Directory>

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:

1
extension=apc.so

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):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# You can override config options very easily.
# Just create a custom options file; it may be version specific:
# - custom-options.sh
# - custom-options-5.sh
# - custom-options-5.3.sh
# - custom-options-5.3.1.sh
#
# Don't touch this file here - it would prevent you to just "svn up"
# your phpfarm source code.

configoptions="\
--enable-bcmath \
--enable-calendar \
--enable-exif \
--enable-ftp \
--enable-gd-native-ttf \
--enable-mbstring \
--enable-pcntl \
--enable-soap \
--enable-sockets \
--enable-wddx \
--enable-zip \
--enable-sysvshm \
--enable-sysvsem \
--enable-sysvmsg \
--enable-cgi \
--with-openssl \
--with-zlib \
--with-pear \
--with-gettext \
--with-imap \
--with-imap-ssl \
--with-kerberos \
--with-pdo-mysql \
--with-mysqli \
--with-mysql \
--with-curl \
--with-gd \
--with-jpeg-dir=/usr/lib \
--with-mcrypt"

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:

1
extension=apcu.so

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....

There are 10 comments left Ir a comentario

  1. Pingback: Instalar múltiples versiones de PHP y extensiones con phpfarm en Ubuntu/Mint/Debian… | PlanetaLibre /

  2. davidochobits /
    Usando Mozilla Firefox Mozilla Firefox 46.0 en Windows Windows NT

    Fantástico artículo y muy útil, directo a mis favoritos, lo probaré 🙂

    Saludos!!

    1. Gaspar Fernández / Post Author
      Usando Mozilla Firefox Mozilla Firefox 46.0 en Ubuntu Linux Ubuntu Linux

      Muchas gracias. Yo llevo ya unos 3 años usándolo y me va de escándalo para el día a día. 🙂 Ya me contarás tu experiencia!

  3. Juan Sebastian Rodriguez /
    Usando Mozilla Firefox Mozilla Firefox 48.0 en Ubuntu Linux Ubuntu Linux

    Hola gracias por compartir el tutorial, aun no lo he aplicado ya que tengo una duda, hace poco monte mi servidor local con apache2, php 7.0 y MariaDB en mi pc ubuntu, anteriormente usaba win7 y ahí tenia php5.4. Con mi nueva versión php7.0 hay una aplicación que no me funciona debido a que requiere la extension mysql y pues quisiera saber si para aplicar el tutorial debo desinstalar mi actual php (7.0) o si lo mantengo o que hacer????

    gracias

    1. Gaspar Fernández / Post Author
      Usando Mozilla Firefox Mozilla Firefox 48.0 en Ubuntu Linux Ubuntu Linux

      Para este tutorial no es necesario eliminar la versión que tienes instalada de PHP (casi casi). El único problema es crear los enlaces simbólicos en /usr/bin porque seguro que tu versión de PHP tiene ahí los ejecutables, pero si te saltas ese paso del tutorial (crear los enlaces) no deberías tener problemas.

  4. Blas /
    Usando Google Chrome Google Chrome 56.0.2924.87 en Windows Windows NT

    Hola, muchas gracias por tus indicaciones. Escribo porque encontre un error al ejecutar compilar php 5.3.29

    /usr/bin/ld: ext/openssl/openssl.o: undefined reference to symbol ‘SSL_get_verify_result@@OPENSSL_1.0.0’
    /usr/lib/i386-linux-gnu/libssl.so.1.0.0: error adding symbols: DSO missing from command line
    collect2: error: ld returned 1 exit status
    Makefile:262: recipe for target ‘sapi/cgi/php-cgi’ failed
    make: *** [sapi/cgi/php-cgi] Error 1
    make failed.

    Estoy buscando como solucionarlo y no doy en la tecla todavía. ¿Podrías orientarme por favor?

    1. Gaspar Fernández / Post Author
      Usando Mozilla Firefox Mozilla Firefox 56.0 en Ubuntu Linux Ubuntu Linux

      Puede que el problema sea que PHP 5.3 es demasiado antiguo y no funcione bien con las nuevas bibliotecas de OpenSSL. Imagino que tienes las bibliotecas de desarrollo instaladas. Tal vez puedas bajar algún OpenSSL viejo y probar con él.

  5. Deyner Paul Reinoso Rosado /
    Usando Mozilla Firefox Mozilla Firefox 56.0 en Windows Windows NT

    If you have this error «error: xml2-config not found» just install this library, I use Ubuntu server:

    «sudo apt-get install libxml2-dev»

    1. Gaspar Fernández / Post Author
      Usando Mozilla Firefox Mozilla Firefox 56.0 en Ubuntu Linux Ubuntu Linux

      Thanks!

  6. Usando Google Chrome Google Chrome 122.0.0.0 en Windows Windows NT

    This is excellent article, thank you for the share! This is what I am looking for, hope in future you will continue sharing such an superb work.

Leave a Reply to Deyner Paul Reinoso Rosado Cancle Reply