Multiples versiones de PHP desde un mismo servidor Apache

Podemos enfrentar muchas situaciones en donde sea necesario correr múltiples versiones de PHP en paralelo. En el caso del cual extraigo este ejemplo la necesidad pasaba por brindar soporte a una aplicación moderna con PHP 7.2 y, al mismo tiempo, a un desarrollo personalizado que no permitía dejar la rama 5.x.

Como punto de partida utilizamos Debian 9 Stretch, ya que cuenta con una nueva infraestructura para paquetes PHP que maneja el versiones de manera nativa.

Instalar PHP

PHP 7.2

Instalamos PHP 7.2 desde los repositorios de Debian.

$ apt-get install php7.2-cli php7.2-fpm

Versiones anteriores de Debian usaban simplementephp5mientras que la nueva infraestructuraphpX.Y. De esta manera podemos instalar múltiples versiones de PHP en paralelo.

PHP 5.6

Debian ofrece solamente una única versión de PHP en el repositorio oficial. Afortunadamente existe un repositorio mantenido por el encargado de los paquetes oficiales de PHP en Debian, Ondřej Surý. Visita su página acerca de paquetería para aprender más. (También existe un repositorio PPA en caso que uses Ubuntu en lugar de Debian.)

Agregamos este repositorio (al tiempo que habilitamos HTTPS para APT y registramos la clave APT):

$ apt-get install apt-transport-https
$ curl https://packages.sury.org/php/apt.gpg | apt-key add -
$ echo 'deb https://packages.sury.org/php/ stretch main' > /etc/apt/sources.list.d/deb.sury.org.list
$ apt-get update

Ahora podemos instalar los paquetes desde allí:

$ apt-get install php5.6-cli php5.6-fpm

Esto instalará PHP 5.6 en paralelo con el PHP 7.2 instalado anteriormente. Podemos verificar esto con:

$ php7.2 -v
PHP 7.2.0-1 (cli)
$ php5.6 -v
PHP 5.6.32-1 (cli)

Configurar PHP

La configuración se almacena en ubicaciones versionadas también. Además, la configuración está separada para cada SAPI. Lo mismo se aplica para los módulos PHP así que no habrá que preocuparse acerca de módulos incompatibles entre versiones.

La configuración de PHP 7.2 FPM se almacena en /etc/php/7.2/fpm y PHP 5.6 en /etc/php/5.6/fpm. Cada instancia FPM consiste de múltiples pools. Cada sitio/proyecto debería tener su pool separado así que creamos una copia de la configuración predeterminada.

$ cp /etc/php/7.2/fpm/pool.d/www.conf /etc/php/7.2/fpm/pool.d/php72.conf
$ cp /etc/php/5.6/fpm/pool.d/www.conf /etc/php/5.6/fpm/pool.d/php56.conf

Buscamos la opción listen. Tendría que ser igual a /run/php/php7.2-fpm.sock o similar. Ahora hacemos los mismo para 5.6, debería contener lo mismo pero con 5.6 en lugar de 7.2. Esto también podría ser una dirección vinculada, ej. dirección IP con puerto (lo cual es más conveniente, en términos de desempeño, que sockets para entornos de producción).

Configurar Apache

Creamos un VirtualHost para cada versión de PHP, ej. /etc/apache2/sites-available/php7.2.conf

Agregamos


<VirtualHost>
...
<FilesMatch "\.php$">
   SetHandler proxy:unix:/run/php/php7.2-fpm.sock|fcgi://localhost
</FilesMatch>
...
</VirtualHost>

Habilitamos el sitio

$ a2ensite php7.2

Y hacemos lo mismo con la configuración para PHP 5.6

Luego habilitamos los módulos necesarios

$ a2enmod proxy_fcgi

Y, por último, reiniciamos los servicios

$ systemctl restart php5.6-fpm php7.2-fpm apache2

Probando todo

Para probar que todo funcione de la manera que esperamos creamos un archivo PHP con la instrucción phpinfo, si todo está bien FPM/FastCGI aparecerá en la salida.

$ echo '<?php phpinfo(); ?>' > /var/www/sitio-php7.2/info.php

 

 

Fuentes |

Publicado en General

Deja un comentario

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

*