Inicio

Sistema de caché en PHP

27 Agosto, 2007 por adrian

¿Caché?

Una caché (o un caché) es, en esencia, una duplicación de los datos originales a los que es mucho menos costoso acceder. En informática es muy frecuente y se utiliza en sistemas de todo tipo, tanto hardware como software.

Cacheando una web

Imaginemos que nuestra web posee un script complejo que requiere de múltiples accesos a la base de datos y numerosas operaciones que ralentizan el servidor. En ocasiones como ésta es recomendable, si no obligatorio, el uso de un sistema caché.

El que aquí implementaremos hará uso de un archivo de texto donde almacenará la página web que se ha solicitado, para servirla en posteriores solicitudes sin tener que realizar consultas a ninguna base de datos ni ningún tipo de operación.

Para ello, comenzamos incluyendo el siguiente código al comienzo de cada página que queramos cachear:

PHP:
  1. // ruta al directorio cache
  2. $cache_directorio = '/ruta/completa/directorio/cache/';
  3. // tiempo de expiracion de la cache (segundos)
  4. $cache_expiracion = 24 * 60 * 60;
  5. // pagina php
  6. $pagina = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
  7. // fichero en el que se guardara la pagina cacheada
  8. $cache_fichero = $cache_directorio . md5($pagina) . ".html";
  9.  
  10. if (@file_exists($cache_fichero)) {
  11.   $cache_fichero_tiempo = @filemtime($cache_fichero);
  12.   if ((time() - $cache_expiracion) <$cache_fichero_tiempo) {
  13.     @readfile($cache_fichero);die();
  14.   }
  15. }
  16.  

Configuración:

  • cache_directorio: es el directorio donde almacenaremos los ficheros con las páginas cacheadas. Debe tener permisos de escritura.
  • cache_expiracion: tiempo de expiración de la caché o tiempo durante el cual serán válidas las páginas cacheadas.
  • pagina: página que se solicita, se usará la url para la codificación del cachelink.
  • cache_fichero: nombre del archivo donde se encontrará cacheada la página actual (no tiene porqué existir en el momento de la ejecución).

El if posterior comprueba si la página solicitada se encuentra ya cacheada (es decir, existe un archivo modificado dentro del tiempo de expiración con el código de dicha página). Si este es el caso, devuelve el contenido del fichero y termina su ejecución, sin realizar ninguna de las operaciones que pueda haber a continuación, las cuales puede ser muy costosas computacionalmente hablando.

¿Qué ocurre si la página no está cacheada? Ejecutamos la página de forma normal, llamando antes a ob_start. Esta función es fundamental en este sistema caché, pues va almacenando en el buffer toda la salida que genere el script PHP.

Al final debemos añadir el siguiente código:

PHP:
  1. if (file_exists($cache_fichero))
  2.   unlink($cache_fichero);
  3.  
  4. // escribimos el fichero con el contenido cacheado
  5. $fic = fopen ($cache_fichero, 'w');
  6. @fclose ($fic);
  7.  
  8. // volcamos la pagina

Como vemos, una vez ejecutado el script y con el contenido de la página en el buffer, volcamos este último en el archivo correspondiente, de forma que en la siguiente solicitud el sistema pueda devolver el contenido cacheado sin necesidad de ejecutar todo el código. Para ello se utiliza la función fwrite a la que pasamos como argumento ob_get_contents, con la que recuperamos y mostramos la información del buffer.

Por último, con ob_end_flush volcamos la misma información mostrando la página como si de una ejecución normal se tratase.

Cuándo utilizarlo y cuándo no

Este sistema devolverá lo que haya en la caché siempre que no se haya sobrepasado el tiempo de expiración. Este comportamiento en ocasiones no será el deseado, pues una página puede haber cambiado su contenido y dejar de ser válida por tanto la versión cacheada.

En estos casos, debemos implementar algún mecanismo de regeneración de la caché (o simplemente un borrado) siempre que se modifique el contenido de alguna página.

Sin embargo puede surgir un incoveniente, y es que si nuestra página cambia con frecuencia el coste de reconstruir la caché puede ser incluso mayor al de ejecutar la página de forma normal. Por fortuna generalmente un sistema como el aquí expuesto mejora notablemente el rendimiento.

Conclusión

Esto es simplemente un acercamiento al funcionamiento de un sistema caché. Por supuesto, si nos decantamos por utilizarlo lo normal sería crear una nueva clase y encerrar dentro de dos funciones el código antes expuesto, de forma que podamos reutilizar en todas las páginas de nuestro sitio sin necesidad de replicar el código.

Entradas más comentadas en el blog

Dejar un comentario

 

 

 

 

 
Hospedaxes © 2010 . Todos los derechos reservados. A Coruña, Galicia (España).

RSS de Hospedaxes

Validar XHTML 1.0 Validar CSS