Sistema básico de caché PHP

Caché PHP

La optimización de tiempos de carga es uno de los aspectos del desarrollo web a los que más atención deberíamos prestar, siendo una de las tareas fundamentales para conseguirlo el uso de sistemas de caché.

Todo sistema de caché tiene dos objetivos muy claros. Por una parte optimizar los tiempos de respuesta reduciendo la carga de trabajo del servidor, en especial en lo referente a accesos a base de datos, y por otra mantener el contenido cacheado lo más actualizado posible. Encontrar y ajustar el punto de equilibrio entre ambos objetivos dependerá de las necesidades concretas de cada proyecto.

En artículos posteriores explicaré cómo evolucionar este sistema de caché PHP para obtener mejores resultados, pero hoy empezaré con una versión básica basada en tiempos de caducidad preestablecidos. El proceso buscado es muy simple:

Al solicitar una página HTML se comprueba si esta está ya cacheada en el servidor. Si no se encuentra cacheada, se genera la página y se almacena para posteriores solicitudes. Si lo está, se comprueba si la copia disponible es suficientemente reciente como para utilizarse, y si no se regenera. Eso es todo.

Os recomiendo generar un directorio en el servidor exclusivo para los archivos HTML de caché, dando a cada uno de estos archivos de caché un nombre unívoco generado a partir de la url de acceso a dicha página.

En el caso de rutas sencillas el archivo de caché podría mantener el mismo identificador que la propia ruta, pero si la ruta es considerablemente larga, una buena solución es codificarla para obtener un identificador más breve y manejable que utilizar como nombre de archivo.

El tiempo de caducidad puede (y debe) ser variable en función de la frecuencia de modificación de cada página. Páginas bastante estáticas pueden tener una caducidad larga (de uno o varios días), mientras que páginas muy dinámicas deberían tener un tiempo de expiración de unos pocos minutos o incluso segundos.

Implementación de la caché PHP

En el fragmento de código anterior, $cachefile se corresponde con la ruta relativa al archivo de caché propio de dicha página y $expiration con el tiempo máximo en segundos de validez del archivo cacheado. Como se puede ver, se reproduce el comportamiento que se exponía anteriormente:

Si existe una página cacheada y además no está caducada, se devuelve directamente y finaliza la ejecución en el servidor sin realizar ningún trabajo extra. Si no existe, o bien la copia existente es demasiado antigua, se genera de nuevo el HTML y se almacena en el sistema de caché.

El HTML que imprimamos debe ser generado después de llamar a la función ob_start(), que se encarga de activar el almacenamiento en el búfer de salida. Una vez generado el código, lo volcamos en el fichero de caché con ob_get_contents() y limpiamos el búfer con ob_flush().

En el caso de sitios web que puedan generar un gran volumen de archivos de caché distintos es recomendable eliminar de forma recurrente el contenido caducado del directorio de caché. Una buena idea es hacerlo con un cron job planificado para ejecutarse diariamente.

Con este sistema tan sencillo conseguimos que en un porcentaje importante de las visitas que reciba el sitio web se sirva automáticamente un archivo HTML, y por lo tanto el tiempo medio de respuesta se vea notablemente reducido.

He hecho unas pequeñas pruebas de carga para cuantificar la incidencia del uso de este sistema de caché PHP en los tiempos de respuesta de uno de mis servidores, y de media supone una mejora de entre el 10% y el 20%. En función del hosting contratado y carga de trabajo que necesite realizar para servir una página, especialmente el número de conexiones con base de datos y el grado de optimización de las consultas, el porcentaje de mejora puede ser incluso mayor.

Más adelante publicaré una versión mejorada que basa la renovación de archivos cacheados en eventos de modificación en lugar de en tiempos de caducidad, que supone un número muy inferior de recargas de caché y a la vez mantiene la tasa de desactualización de los ficheros cacheados en prácticamente 0.

Uso de cookies

Este sitio web, como todos, utiliza cookies. Si continúas navegando por la web estás dando tu consentimiento para la aceptación de la política de cookies de este sitio web. ACEPTAR

Aviso de cookies