Moodle 6 min de lectura 19 de marzo de 2026

Configurar Redis para Moodle y resolver problemas con múltiples versiones de PHP

Soluciona errores de conexión y habilita el caché de Redis en Moodle paso a paso

Solución en "Dos Clics" (TL;DR)

Guía para solucionar problemas de integración de Redis con Moodle, causados por una discrepancia de versiones de PHP entre la interfaz de comandos (CLI) y el servidor web.

Configurar un sistema de caché en memoria como Redis es uno de los pasos más efectivos para acelerar plataformas exigentes como WordPress y Moodle. Sin embargo, lo que parece una instalación rutinaria de pocos comandos puede convertirse en un laberinto de diagnósticos confusos cuando el entorno del servidor maneja múltiples versiones de PHP de forma simultánea.

Recientemente me enfrenté a este escenario exacto mientras optimizaba un servidor VPS administrado con Virtualmin. Aunque las herramientas de diagnóstico por línea de comandos (CLI) aseguraban que todo estaba en orden, las aplicaciones web se empeñaban en ignorar la existencia de Redis. Esta es la bitácora de cómo desarmé el problema paso a paso, desde los conflictos de alias en Systemd hasta la discrepancia oculta de versiones de PHP.

1. El síntoma inicial y el despiste de la consola

El objetivo inicial era simple: habilitar el almacenamiento en caché de objetos mediante Redis para un sitio WordPress y, posteriormente, integrarlo en una plataforma Moodle 4.0.12. Tras realizar la instalación básica de los paquetes en el servidor, el plugin de WordPress seguía reportando que Redis no estaba habilitado.

Mi primera reacción fue verificar si el módulo de PHP estaba cargado ejecutando el clásico comando de diagnóstico:

Terminal (SSH)
php -m

La salida del comando listaba claramente el módulo:

Terminal (SSH)
[PHP Modules]
...
readline
redis
Reflection
...

Con el módulo aparentemente activo en PHP, el foco de la sospecha se trasladó al propio servicio de Redis.

2. El primer tropiezo: El servicio de Redis y los alias de Systemd

Al comprobar el estado del servicio de Redis, descubrí que estaba completamente inactivo:

Terminal (SSH)
root@web:~# sudo systemctl status redis
○ redis-server.service - Advanced key-value store
     Loaded: loaded (/lib/systemd/system/redis-server.service; enabled; vendor preset: enabled)
     Active: inactive (dead)

Intenté iniciar y habilitar el servicio para que arrancara automáticamente con el sistema, pero Systemd rechazó la instrucción de habilitación:

Terminal (SSH)
root@web:~# sudo systemctl enable redis
Failed to enable unit: Refusing to operate on alias name or linked unit file: redis.service
Error detectado: En distribuciones basadas en Debian/Ubuntu, redis.service suele ser un alias o un enlace simbólico apuntando a la unidad real, que es redis-server.service. Systemd rechaza operaciones de habilitación (enable) sobre alias para evitar inconsistencias.

La solución para este primer escollo fue interactuar directamente con el nombre del servicio real:

Terminal (SSH)
sudo systemctl start redis-server
sudo systemctl enable redis-server

Tras esto, una prueba rápida con la herramienta de línea de comandos confirmó que el motor de base de datos en memoria estaba respondiendo perfectamente:

Terminal (SSH)
root@web:~# redis-cli ping
PONG

Con Redis activo, WordPress finalmente reconoció la caché de objetos. Sin embargo, el verdadero desafío comenzó al intentar replicar el éxito en Moodle.

3. El laberinto de Moodle y el misterio de "Add Instance"

Al ingresar a la administración de caché de Moodle 4.0.12 (Administración del sitio → Plugins → Caché → Configuración), me encontré con una pared: la sección de Redis aparecía listada en la tabla de almacenes de caché (cachestores), pero a diferencia de la caché de archivos (File cache), no mostraba la opción "Add instance" (Agregar instancia). Solo permitía configurar un "Servidor de pruebas" (Test server), lo cual no habilita el uso real en producción.

Pensando que se trataba de un problema de registro del plugin, decidí clonar la rama correspondiente del almacén de caché de Redis directamente desde el repositorio oficial de Moodle:

Terminal (SSH)
cd /home/dosclic/domains/plataforma.dosclic.com/public_html/cache/stores/
git clone -b MOODLE_400_STABLE https://github.com/moodle/moodle.git redis

Posteriormente, ejecuté el script de actualización por CLI para forzar a Moodle a registrar el plugin:

Terminal (SSH)
php admin/cli/upgrade.php

El sistema procesó la actualización e indicó que el plugin cachestore_redis se había registrado con éxito. Sin embargo, al regresar a la interfaz web, la opción "Add instance" seguía sin aparecer.

4. Forzando la URL y el error ex_unmetstorerequirements

Decidí realizar un bypass visual. Observando la estructura de las URLs de Moodle, noté que el enlace para añadir un almacén de archivos era:

https://plataforma.dosclic.com/cache/admin.php?action=addstore&plugin=file

Especulé que si modificaba el parámetro del plugin directamente en la barra de direcciones del navegador, podría forzar la creación de la instancia de Redis:

https://plataforma.dosclic.com/cache/admin.php?action=addstore&plugin=redis

Al cargar la URL modificada, Moodle finalmente arrojó un error explícito que reveló la raíz del problema:

Error detectado: You are unable to use this store at the present time. Please refer to the documentation to determine its requirements.
Error code: ex_unmetstorerequirements

Este error es una validación interna de Moodle. Significa que, aunque el código del plugin está presente, el entorno de ejecución de PHP no cumple con los requisitos mínimos para interactuar con Redis.

5. El punto de quiebre: La discrepancia de versiones de PHP (CLI vs Web)

Para aislar el problema, creé un script PHP de prueba muy sencillo (test_redis.php) en la raíz del sitio web para intentar instanciar la clase de Redis:

Archivo test_redis.php
<?php
$redis = new Redis();
try {
    $redis->connect('127.0.0.1', 6379);
    echo "Conexión exitosa\n";
} catch (Exception $e) {
    echo "Error: " . $e->getMessage() . "\n";
}

Al ejecutarlo desde la terminal, obtuve un error fatal inmediato:

Terminal (SSH)
root@web:/home/dosclic/...# php test_redis.php
PHP Fatal error:  Uncaught Error: Class "Redis" not found in /home/dosclic/.../test_redis.php:2

¿Cómo era posible que la clase Redis no existiera si previamente php -m me había mostrado el módulo cargado? La respuesta la obtuve al rastrear la ubicación física de los archivos de configuración del módulo en el servidor:

Terminal (SSH)
root@web:~# find /etc/php/*/ -iname "*redis*"
/etc/php/8.5/phpdbg/conf.d/25-redis.ini
/etc/php/8.5/mods-available/redis.ini
/etc/php/8.5/cli/conf.d/25-redis.ini

El diagnóstico era definitivo:

  • El comando php -m en la terminal se estaba ejecutando bajo PHP 8.5 (CLI), donde el módulo de Redis sí estaba instalado y configurado.
  • Sin embargo, el servidor web (configurado a través de Virtualmin) estaba sirviendo el sitio de Moodle utilizando PHP 8.0.
  • En el entorno de PHP 8.0, la extensión php-redis no existía en absoluto. Por esta razón, Moodle (corriendo bajo el servidor web con PHP 8.0) no detectaba el soporte de Redis y bloqueaba preventivamente la opción de añadir instancias.

6. La solución definitiva

Para resolver el problema, fue necesario instalar la extensión de Redis específicamente para la versión de PHP que el servidor web estaba utilizando para Moodle:

Terminal (SSH)
sudo apt install php8.0-redis

Una vez instalado el paquete, reinicié el servidor web Apache para que cargara la nueva configuración de PHP:

Terminal (SSH)
sudo systemctl restart apache2

Para verificar que todo estaba en orden, accedí a la herramienta interna de Moodle en https://plataforma.dosclic.com/admin/phpinfo.php. La sección redis finalmente apareció listada como activa.

Consejo Práctico: Cuando administres servidores con múltiples versiones de PHP (muy común en paneles como Virtualmin, cPanel o Plesk), nunca asumas que lo que ves en la terminal (CLI) refleja el estado del servidor web. Valida siempre el entorno web usando un archivo con phpinfo() o ejecutando scripts de prueba directamente desde el navegador.

Al regresar a la configuración de almacenes de caché en Moodle, el botón "Add instance" para Redis apareció habilitado de forma automática. Configuré la instancia apuntando a 127.0.0.1 en el puerto 6379, guardé los cambios y asigné Redis como el almacén principal para la caché de aplicaciones y sesiones.

Para la confirmación final, ejecuté el monitor de Redis en la terminal mientras navegaba por la plataforma:

Terminal (SSH)
root@web:~# redis-cli monitor
OK
1679234989.102345 [0 127.0.0.1:56721] "GET" "moodle_cache_application..."
1679234989.105678 [0 127.0.0.1:56721] "SET" "moodle_cache_session..."

El flujo de datos en tiempo real confirmó que Moodle estaba utilizando Redis de manera exitosa, reduciendo drásticamente los tiempos de carga y la carga sobre la base de datos MySQL.

La historia detrás de la nota

Este caso me recordó la importancia de no dar nada por sentado en entornos multi-PHP. Un simple comando CLI puede mentirte piadosamente si no estás ejecutando la misma versión que tu servidor web.