Muchas veces las páginas web que podemos tener alojadas en un servidor apache necesitan una versión de PHP concreta para funcionar, o al menos un rango de versiones en las que esa página funciona correctamente, y si sois tan paranoicos como lo soy yo con las actualizaciones de los programas y del sistema operativo, esto a veces puede suponer un problema.

¿Problema? Pues si tienes siempre actualizado todo lo que tienes instalado en tu equipo ya me dirás qué clase de problema puede suponer esto. 

Pues puede ser algo más problemático de lo que parece a simple vista, y te lo voy a mostrar con un ejemplo real.

Yo en varias máquinas gestiono distintas instalaciones de NextCloud, que se trata de un… digamos… sistema que te genera una página web similar a «Dropbox«, «OneDrive» o «Google Drive«. En pocas palabras: NextCloud te permite tener una nube personal y controlada para poder almacenar tus ficheros y así acceder a ellos desde cualquier otra ubicación. La página web que genera nextcloud la tengo corriendo en servidores «apache» y la versión actual estable de Nextcloud (en el momento de escribir este artículo es la 17.0.3) sólo es capaz de funcionar sobre versiones de PHP entre la 7.1 y la 7.3 (no es capaz de funcionar correctamente sobre PHP 7.4).

Vale... todo muy bien. Ahora ¿Cuál es el problema?

Pues que en un momento dado, el sistema operativo instaló él solito la versión de PHP 7.4 y la puso por defecto. Desde ese momento, Nextcloud empezó a experimentar errores, sobre todo a la hora de ejecutar tareas programadas. Esto no es deseable que ocurra y en este artículo vamos a ver cómo solucionarlo.

Vale, vale... pero con a2dismod puedes deshabilitar una versión de php en concreto en Apache. 

Sí. Efectivamente. Puedo hacer que Apache no use la versión 7.4 de PHP con este comando.

sudo a2dismod php7.4

Y forzar que use la versión 7.3 con este otro

sudo a2enmod php7.3

Eso sí… si lo haces no te olvides luego de reiniciar Apache para que se apliquen los cambios con el siguiente comando.

sudo service apache2 restart
Entonces ¿Cuál es el problema? 

Pues el problema es que esto lo estoy haciendo únicamente para Apache, y no para el sistema operativo entero. En el ejemplo que te puse antes del Nextcloud, para que esta página funcione correctamente, cada 5 minutos se debe ejecutar una tarea similar a esta (en el cron del usuario www-data).

php -f /var/www/nextcloud/cron.php

Y fíjate que en esa tarea no interviene Apache en ningún momento. Se ejecuta fuera de apache, por lo que aunque tengamos definido en apache que cualquier contenido programado en PHP debe ejecutarse con una versión en concreto de PHP, al no ejecutar esta tarea con Apache, el sistema la realizará con la versión que tenga por defecto, que en mi caso era la versión 7.4 de PHP, que precisamente aún no es compatible con la última versión de Nextcloud que es la que tengo instalada.

Vale... pero puedes hacer que ese comando se ejecute con una versión en concreto de PHP.

En efecto. Podrías ejecutar el comando haciendo algo similar a esto…

php7.3 -f /var/www/nextcloud/cron.php

… pero lo suyo sería forzar a que el sistema entero usara la versión que nosotros queramos.

Vale... ¿y eso cómo se hace?

Pues de forma muy simple y con un único comando. Es algo tan sencillo como ejecutar esto:

sudo update-alternatives --config php

Ese comando nos mostrará algo similar a esto.

Con ese comando podremos ver todas las versiones de PHP que tengamos instaladas en ese momento en nuestro equipo y nos dejará elegir la versión que usará el sistema operativo por defecto pulsando el número de la versión deseada. En el ejemplo que os he puesto, y hasta que Nextcloud sea compatible con la versión 7.4, deberíamos seleccionar la opción 2 o 3.

Eso sí… si por algún motivo debemos en algún momento ejecutar algo con la versión 7.4, siempre podremos hacer algo similar a lo que indicamos antes, que no es otra cosa que forzar ese comando en concreto a usar la versión que queremos usar para esa tarea concreta. Algo similar a esto.

sudo -u www-data php7.3 -f cron.php

Así que con estos comandos deberíais poder lidiar con cualquier actualización problemática de php.

Share