Uno de los mayores problemas al desarrollar una aplicación medianamente grande con PHP es la lentitud de los accesos a la base de datos en consultas complejas. En esos casos, lo mejor que puedes hacer es usar un sistema de caché, que almacene los datos necesarios y tan difíciles de obtener.

Hay algunos sistemas geniales, como Memcached, o APC, pero no están implementados en la grandísima mayoría de los servidores. Al resto de los mortales sólo nos queda la caché de archivos.

No obstante, este sistema es casi tan rápido como los sistemas anteriores (sobre todo con objetos grandes).

Ver en github

Su uso es sencillo: Puedes almacenar cualquier tipo de datos gracias a la función serialize, y se almacenan y obtienen según una clave. Tienen un tiempo de expiración (que puedes configurar), así que si el archivo ha expirado, no devolverá nada. Por ejemplo, imaginemos que tenemos un blog con millones de categorías:

/*
 * Si tenemos muchísimas categorías, hacer esto cada solicitud sería una catástrofe
 */
$categorias = $pdo->query('SELECT * FROM `categorias`')->fetchAll();
// Trabajar con las categorías

En vez de eso:

// Miramos a ver si existe una copia en la caché
$categorias = Cache::get('todas_las_categorias');
if( ! $categorias ) )  {
    $categorias = $pdo->query('SELECT * FROM `categorias`')->fetchAll();
    Cache::put('todas_las_categorias', $categorias);
}
// Trabajar con las categorías

El tiempo de expiración y el directorio que almacenará los archivos

Por defecto, el tiempo de expiración es de 3 horas, y el directorio donde se guarda la caché es cache. No obstante, podéis configurarlo así:

Cache::configure(array(
    'cache_dir' => dirname(__FILE__) . '/midirectoriodecache',
    'expires' => 24 // horas
));

Borrar la caché

Si queremos borrar todo:

Cache::flush();

Si sólo queremos borrar una key (imaginemos que se ha creado una categoría nueva):

Cache::delete('todas_las_categorias');

El código

El código está ahora mismo en github, así que ahí podéis obtener la versión más actualizada:

Descarga

12 pensamientos en “Implementar un sistema de caché simple en PHP

  1. Bitacoras.com
  2. Imagen de Juvinao el dijo:

    Emilio mi blog esta demorando mucho en cargar, en la parte inferior del navegador aparece esto:

    Esperando a adv.yougo.com.br

    Y la verdad no se que hacer, esto hace que mi blog se demore casi 1 minuto en cargar por lo que es mucho tiempo :(

    • Imagen de Emilio Cobos Álvarez el dijo:

      Ese código no está generado por blogger, comprueba las DNS’s del dominio para asegurarse de que son las de google.
      Prueba reponiendo las DNS.

      ¿Es posible que hayan accedido a tu cuenta del dominio? En ese caso deberás contactar con tu proveedor para que te diga qué puedes hacer.

  3. FeedReader: Pequeño agregador de feeds en PHP | Emilio Cobos-CMC
  4. Buscar tweets con PHP (Twitter API 1.1) | Emilio Cobos
  5. Imagen de Andres FuentesAndres Fuentes el dijo:

    No logro hacer funcionar la clase no crea el archivo de cache en la carpeta cache. He colocado cada instrucción propia de la clase en bloques try y no parece haber problemas.

  6. Imagen de Kerbin el dijo:

    Hola amigo lo probe y funciona muy bien como puedo hacer para guardar varios datos en un mismo cache y luego poder mostrarlo cada uno por separado

    ejemplo

    $data = get(‘google’);
    $data[nombre];
    $data[apellido];

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Puedes usar las siguientes etiquetas y atributos HTML:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre data-language=""> <ul> <ol> <li>
Para poner código usa <pre data-language="[lenguaje]"><code>[código]</code></pre>, y no olvides escapar el HTMl.