(Intentado) Cacheando sentencias SQL con PHP

  • Autor Autor Miguel92
  • Fecha de inicio Fecha de inicio
El protocolo HTTP ya incluye mecanismos de caché integrados. Basta con configurar las cabeceras PHP adecuadas (como Cache-Control) para definir el tiempo máximo de almacenamiento en caché.

El cacheo en disco implica un costo operacional que muchas veces no compensa. Las bases de datos modernas (MySQL, PostgreSQL) ya implementan caché de consultas automáticamente - cuando ejecutas el mismo query dos veces, la segunda respuesta será más rápida porque viene de la caché interna del motor.

Cuando tu aplicación PHP y la base de datos están en el mismo servidor, implementar un sistema de caché adicional con archivos locales solo añade complejidad sin beneficios reales. Donde sí tiene sentido es en entornos distribuidos, donde la base de datos está en un servidor separado. En esos casos, la latencia de red hace que el cacheo local pueda mejorar los tiempos de respuesta.

La latencia es el principal cuello de botella en aplicaciones escalables. Soluciones profesionales usan sistemas como Redis o Memcached específicamente diseñados para caché. Algunas arquitecturas avanzadas implementan réplicas de lectura locales que se sincronizan con la base de datos principal, permitiendo consultas rápidas mientras mantienen la consistencia.

En benchmarks reales, frameworks como Laravel con todos sus sistemas de caché activados suelen mostrar tiempos entre 200-800ms por petición. Sistemas más optimizados y personalizados, especialmente aquellos que minimizan capas de abstracción, pueden lograr 100-300ms en las mismas condiciones.

La diferencia radica en que cada capa de caché añade cierta sobrecarga, y en algunos casos el costo de mantener la caché puede superar los beneficios. Una infraestructura bien diseñada debe equilibrar estos factores según las necesidades específicas del proyecto.

Referencias tecnicas:
https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Cache-Control
 
interesante, gracias por las ideas
 
Hace muchos años intenté algo similar, pero mi solución fue generar el html de las páginas y así evitar el php+mysql. Con esto mismo:

$page=file_get_contents('https://la_web_a_copiar.com/mi_archivo.php');
$fp=fopen('mi_archivo.html','w+');
fputs($fp,$page);
fclose($fp);

Puedes crear el html completo. Luego, con un cron las vuelves a recrear cuando lo necesites.

Pero es cierto que hoy en día hay muchas soluciones de caché que permiten una velocidad similar o incluso mejor.
 
Buenas, la idea que tienes no es algo que no se nos haya pasado por la cabeza a muchos y lo hemos hecho todos.

Aún así, hay que tomar en cuenta que el caché en disco sólo es viable cuando la ejecución de PHP + la consulta SQL van a ser más lentas, cosa que muchísimas veces no es así.

En tu caso dices que quieres hacerlo con la consulta solamente, por lo que supongo que luego ese archivo lo volverás a leer desde el disco... ahí es muy difícil que tu caché le gane a la consulta, pero sí te puedo recomendar intentar hacerlo con un cache en memoria (apu, memcache, redis, etc), por ej.:

PHP:
<?php
function intentamosObteterDatosDesdeCacheEnMemoriaSiEsPosible() {
    // Nos aseguramos de tener apc instalado y habilitado
    if (!function_exists('apcu_enabled') || !apcu_enabled())
        return funcionQueDevuelveElResultadoDeLaConsulta();

    $key = 'aqui_un_texto_unico_para_la_consulta';
   
    // Comprobamos si está en caché para devolverlo
    if($result = apcu_fetch($key))
        return $result;

    // Si no está, obtenermos los datos normalmente
    $result = funcionQueDevuelveElResultadoDeLaConsulta();

    // Guardamos los datos en el caché (600 segundos)
    apcu_store($key, $result, 600);
    return $result;
}

Básicamente con eso estás guardando los datos en la ram que es mucho mas rápida que el disco y durará 5 minutos allí.

kj
 
Atrás
Arriba