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.3 y, al mismo tiempo, a un desarrollo personalizado que no permitía dejar la rama 7.x.
Como punto de partida utilizamos Debian 10 Buster.
Instalar PHP
PHP 7.3
Instalamos PHP 7.3 desde los repositorios de Debian.
$ apt-get install php7.3-cli php7.3-fpm
Versiones anteriores de Debian usaban simplemente php5
mientras que la nueva infraestructura phpX.Y
. De esta manera podemos instalar múltiples versiones de PHP en paralelo.
PHP 7.0
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ý. Visitá su página acerca de paquetería para aprender más. (También existe un repositorio PPA en caso que uses Ubuntu.)
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 php7.0-cli php7.0-fpm
Esto instalará PHP 7.0 en paralelo con el PHP 7.3 instalado anteriormente. Podemos verificar esto con:
$ php7.3 -v
PHP 7.3.0-1 (cli)
$ php7.0 -v
PHP 7.0.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.3 FPM se almacena en /etc/php/7.3/fpm
y PHP 7.0 en /etc/php/7.0/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.3/fpm/pool.d/www.conf /etc/php/7.3/fpm/pool.d/php72.conf
$ cp /etc/php/7.0/fpm/pool.d/www.conf /etc/php/7.0/fpm/pool.d/php56.conf
Buscamos la opción listen
. Tendría que ser igual a /run/php/php7.3-fpm.sock
o similar. Ahora hacemos los mismo para 7.0, debería contener lo mismo pero con 7.0 en lugar de 7.3. 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.3.conf
Agregamos
<VirtualHost>
...
<FilesMatch "\.php$">
SetHandler proxy:unix:/run/php/php7.3-fpm.sock|fcgi://localhost
</FilesMatch>
...
</VirtualHost>
Habilitamos el sitio
$ a2ensite php7.3
Y hacemos lo mismo con la configuración para PHP 7.0
Luego habilitamos los módulos necesarios
$ a2enmod proxy_fcgi
Y, por último, reiniciamos los servicios
$ systemctl restart php7.0-fpm php7.3-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.3/info.php