fix(cache): sin Redis la web sigue sin caché en vez de morir
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) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
80b6541e30
commit
cb03ecd239
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user