Múltiples Versiones PHP

¡Hola!

Hoy me toca hacer un post super divertido en el cual tengo que instalar distintas versiones de PHP en los servidores.

Por defecto, dependiendo de la versión del sistema operativo, tenemos una versión de PHP establecida en los repositorios oficiales. Lo que vamos hacer es instalar otros que nos permitan tener hasta la 7.3 si es necesaria.

Otra cosa más a tener en cuenta es como queremos ejecutar esa versión de PHP si es por el SITE o en todo el sistema operativo (por defecto). Intentaremos cubrir todas las necesidades posibles.

Especificaciones/Requeriments

  • OS
    • Ubuntu 16.04 LTS (Versión de PHP paquetizada 7.0.x)
    • Ubuntu 18.04 LTS (Versión de PHP paquetizada 7.1.x)
  • Recordad los módulos de PHP instalados (dpkg -l | grep php)

Siempre hay que tener en cuenta lo que tenemos montado en el servidor. No podemos hacer estos cambios a lo loco ya que puede romper más de alguna web/cosa y por lo tanto dar muchos dolores de cabeza/trabajo.

Instalando Múltiples Versiones PHP

Requisitos Previos

apt install python-software-properties
add-apt-repository ppa:ondrej/php
apt update

Ya tenemos nuestra primera parte (y la más importante XD) ahora lo que nos queda es instalar cada versión que necesitamos y sus módulos.

Instalando las versiones PHP

# PHP 7.1.x
apt-get install php7.1-bcmath php7.1-cgi php7.1-cli php7.1-common php7.1-curl php7.1-fpm php7.1-gd php7.1-json php7.1-mbstring php7.1-mcrypt php7.1-mysql php7.1-opcache php7.1-readline php7.1-sqlite3 php7.1-tidy php7.1-xml php7.1-zip
# PHP 7.2.x
apt-get install php7.2-bcmath php7.2-cgi php7.2-cli php7.2-common php7.2-curl php7.2-fpm php7.2-gd php7.2-json php7.2-mbstring php7.2-mysql php7.2-opcache php7.2-readline php7.2-sqlite3 php7.2-tidy php7.2-xml php7.2-zip
# PHP 7.3.x
apt-get install php7.3-bcmath php7.3-cgi php7.3-cli php7.3-common php7.3-curl php7.3-fpm php7.3-gd php7.3-json php7.3-mbstring php7.3-mysql php7.3-opcache php7.3-readline php7.3-sqlite3 php7.3-tidy php7.3-xml php7.3-zip

Podéis instalar todas o solo una de las versiones, no pasa nada ya que no afecta a la versión del sistema.

Tened en cuenta que la extensión «mcrypt» no existe para las versiones 7.2.x en adelante y se tiene que instalar de otra manera.

Instalando mcrypt 7.2.x

Antes de empezar debemos tener en cuenta que mcrypt se ha quedado en obsoleta a partir de la versión 7.2.x. Así que con esto en mente en versiones posteriores terminará desapareciendo. Por lo tanto es recomendable que se cambie de sistema o de librería en vuestra programación.

apt-get install php-pear
apt-get install php7.2-dev

apt-get -y install gcc make autoconf libc-dev pkg-config
apt-get -y install libmcrypt-dev
pecl install mcrypt-1.0.1

Te preguntará algo relacionado a «libmcrypt prefix? [autodetect]» pulsamos enter y listo. Te indicará la ruta donde se ha instalado. En nuestro caso ha sido:

/usr/lib/php/20170718/mcrypt.so

Ahora solo nos queda habilitar la extensión para PHP 7.2:

bash -c "echo extension=/usr/lib/php/20170718/mcrypt.so > /etc/php/7.2/cli/conf.d/mcrypt.ini"
bash -c "echo extension=/usr/lib/php/20170718/mcrypt.so > /etc/php/7.2/cgi/conf.d/mcrypt.ini"
bash -c "echo extension=/usr/lib/php/20170718/mcrypt.so > /etc/php/7.2/fpm/conf.d/mcrypt.ini"
bash -c "echo extension=/usr/lib/php/20170718/mcrypt.so > /etc/php/7.2/mods-available/mcrypt.ini"

Para comprobar que todo ha ido bien

php -i | grep mcrypt
/usr/bin/php7.2 -i | grep mcrypt

En teoría se puede hacer de la misma manera con la versión de PHP 7.3 lo único que cambia la carpeta por /usr/lib/php/20180731/mcrypt.so. Así que las rutas cambian. Si algún día me toca probarlo lo corroboraré.

Antes de proceder…

En mi caso he tenido un problema en el sistema, por defecto al intentar actualizar/instalar ya que me pedía actualizar el binario de php entre otras cosas. Al hacerlo, me actualizó directamente a la versión de php 7.3.

Para volver a la versión de PHP 7.0.x (la que venía en el sistema) ejecuté el siguiente comando:

update-alternatives --config php

Y me da un listado del PHP que quiero por defecto:

Elige sabiamente tu versión de PHP en el sistema

Con esto hemos dejado solventado el pequeño problema que nos hemos encontrado con el binario de PHP.

Otra cosa más…

También había paquetes de la 7.0.x que me decía que ya no los necesitaba cuando hacía el upgrade (apt autoremove). Para ello ejecuté lo siguiente:

apt autoremove
apt install php7.0-bcmath php7.0-curl php7.0-gd php7.0-sqlite3 php7.0-tidy php7.0-zip

Estos fueron los paquetes que me dijo que tenía que borrar así que tomad en cuenta los vuestros a la hora de hacerlo. Así cuando apliquemos los parches no nos dará ningún problema y nadie comete equivocaciones.

Un fallito extra…

Otro fallo que me he encontrado es a la hora de que me activaba el módulo de PHP para apache. Mi sistema hace tiempo que no usa este sistema por el hecho de que, por seguridad, cada site se ejecuta con su propio usuario.

Esto provocaba que al acceder a las páginas web apareciera como si se quisiera descargar la web.

Para ello, en mi caso, tuve que desactivarlo con el siguiente comando

a2dismod php7.3
service apache2 restart

Con esto quedó resuelto el misterio.

Conclusión

Después de esto hemos conseguido lo siguiente:

  • Instalar las versiones de PHP 7.1.x a 7.3.x
  • Arreglar posibles fallos que podamos encontrar
  • Configurar la versión de PHP por defecto en nuestro sistema.

Deja un comentario

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