From cb03ecd23959ca1165ec3e0780821493cbb2546b Mon Sep 17 00:00:00 2001 From: Acai Forge Date: Fri, 2 Oct 2026 17:08:52 +0000 Subject: [PATCH] =?UTF-8?q?fix(cache):=20sin=20Redis=20la=20web=20sigue=20?= =?UTF-8?q?sin=20cach=C3=A9=20en=20vez=20de=20morir?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit initCache() de CocoDB y AcaiAPI conectaba sin capturar errores: en un hosting sin Redis (o sin la extensión) el plugin cache_handler tumbaba la web entera con un RedisException. Ahora se marca como no disponible para el resto de la petición y cacheGet/cacheSet, que ya comprobaban la conexión, no hacen nada. Con Redis el comportamiento no cambia. Co-Authored-By: Claude Opus 5.5 (1M context) --- cms/lib/classes/AcaiAPI.php | 26 +++++++++++++++++++++----- cms/lib/classes/CocoDB.php | 26 +++++++++++++++++++++----- 2 files changed, 42 insertions(+), 10 deletions(-) diff --git a/cms/lib/classes/AcaiAPI.php b/cms/lib/classes/AcaiAPI.php index be26f53..c301438 100644 --- a/cms/lib/classes/AcaiAPI.php +++ b/cms/lib/classes/AcaiAPI.php @@ -34,6 +34,7 @@ class AcaiAPI // ── Cache flags (mirror CocoDB interface) ───────────────────────── public static $redis = null; public static $redis_expireTime = 0; + public static $redis_no_disponible = false; public static $force_load_cache = false; public static $force_redis = false; public static $force_redis_module = false; // consumed by external cache layer @@ -647,14 +648,29 @@ class AcaiAPI /** Connect to Redis (idempotent). */ static function initCache() { + // Sin Redis (hosting propio sin el servicio o sin la extensión, o el + // servicio caído) la web sigue SIN caché en vez de morir con un fatal: + // cacheGet/cacheSet ya no hacen nada si no hay conexión. Se marca para + // no reintentar en cada consulta de la misma petición. + if (self::$redis_no_disponible) return; + if (!class_exists('Redis')) { + self::$redis_no_disponible = true; + self::$redis = null; + return; + } + $redisHost = getenv('REDIS_HOST') ?: '127.0.0.1'; $redisPort = (int)(getenv('REDIS_PORT') ?: 6379); - if (!self::$redis) { - self::$redis = new Redis(); - self::$redis->connect($redisHost, $redisPort); - } elseif (!self::$redis->isConnected()) { - self::$redis->connect($redisHost, $redisPort); + try { + if (!self::$redis) self::$redis = new Redis(); + if (!self::$redis->isConnected() && !self::$redis->connect($redisHost, $redisPort)) { + throw new RuntimeException("no se pudo conectar a $redisHost:$redisPort"); + } + } catch (Throwable $e) { + self::$redis_no_disponible = true; + self::$redis = null; + error_log('[cache] Redis no disponible, se sigue sin caché: ' . $e->getMessage()); } } diff --git a/cms/lib/classes/CocoDB.php b/cms/lib/classes/CocoDB.php index bd1fe1d..1693c47 100755 --- a/cms/lib/classes/CocoDB.php +++ b/cms/lib/classes/CocoDB.php @@ -14,6 +14,7 @@ class CocoDB public static $trackData = []; public static $redis = null; public static $redis_expireTime = 0; + public static $redis_no_disponible = false; public static $force_load_cache = false; public static $force_redis = false; public static $force_redis_module = false; @@ -1176,14 +1177,29 @@ class CocoDB */ static function initCache() { + // Sin Redis (hosting propio sin el servicio o sin la extensión, o el + // servicio caído) la web sigue SIN caché en vez de morir con un fatal: + // cacheGet/cacheSet ya no hacen nada si no hay conexión. Se marca para + // no reintentar en cada consulta de la misma petición. + if (self::$redis_no_disponible) return; + if (!class_exists('Redis')) { + self::$redis_no_disponible = true; + self::$redis = null; + return; + } + $redisHost = getenv('REDIS_HOST') ?: '127.0.0.1'; $redisPort = (int)(getenv('REDIS_PORT') ?: 6379); - if (!self::$redis) { - self::$redis = new Redis(); - self::$redis->connect($redisHost, $redisPort); - } else if (!self::$redis->isConnected()) { - self::$redis->connect($redisHost, $redisPort); + try { + if (!self::$redis) self::$redis = new Redis(); + if (!self::$redis->isConnected() && !self::$redis->connect($redisHost, $redisPort)) { + throw new RuntimeException("no se pudo conectar a $redisHost:$redisPort"); + } + } catch (Throwable $e) { + self::$redis_no_disponible = true; + self::$redis = null; + error_log('[cache] Redis no disponible, se sigue sin caché: ' . $e->getMessage()); } }