Caché de HTTP con Symfony2
El uso correcto de las cachés es una de esas cosas que son capaces de disparar el rendimiento de un web, sin embargo es algo que pocas veces se acomete de forma completa por su complejidad y por todas las posibilidades que hay. Symfony2 proporciona un stack de caché que cumple el estándar HTTP y que simplifica en gran medida el uso de cachés en una aplicación web.
En la documentación oficial hay un capítulo específico que explica qué es un gateway caché y cómo funciona el proxy de caché que monta Symfony2. Explica también como el hecho de implementar la especificación HTTP, permite sustituir de forma transparente la caché de Symfony2 por otros sistemas de caché más potentes como Varnish. En el documento se da además una introducción bastante buena a cómo controlar las validaciones y expiraciones de los elementos de caché, así como a la invalidación.
En otros sistemas de caché lo habitual es que desde el código de la aplicación se consulte a un servicio si existe un elemento disponible con un id determinado. Si existe se devuelve esa información y en caso contrario se genera, se guarda en caché para siguientes peticiones y se devuelve al usuario. Sin embargo el uso de una caché HTTP es algo diferente. Únicamente hay que indicar en las cabeceras de las respuesta las condiciones de funcionamiento de las respuesta HTTP que se está generando. Así, por ejemplo, el siguiente código indica que la página que se está generando tiene un tiempo de validez de 10 minutos.
$date = new DateTime(); $date->modify('+600 seconds'); $response->setExpires($date); |
Cuando se produzca una nueva petición de esta página, el motor de gateway de caché HTTP de Symfony2 interceptará la petición y en el caso de que no hayan transcurrido los 10 minutos devolverá el mismo resultado sin que la petición llegue siquiera al controlador.
La documentación de Symfony2 contiene también un apartado referido a la implementación que ha hecho Symfony2 de bloques de caché utilizando «Edge Side Includes» (ESI). Esta tecnología, originaria de Akamai, permite incluir en una página bloques con una gestión de caché independiente de la página que los contiene. Esto permite por ejemplo que en páginas que contienen algún bloque que se actualiza con mayor frecuencia que la propia página, estos bloques se actualicen en caché sin requerir refrescar toda la página. Para incluir uno de estos bloques en una página se utilizan los bloques render
de twig, indicando que es un bloque ESI mediante standalone
a true
. Symfony2 se encarga de mostrar el renderizado o poner las etiquetas ESI en función de la validez del bloque o de si el gateway de caché utilizado soporta ESI, en el caso de que estemos utilizando otro gateway alternativo al incluido en Symfony2.
{% render '...:news' with {}, {'standalone': true} %} |
Si quieres saber más sobre el funcionamiento de las cachés te recomiendo la lectura de estas dos entradas, referenciadas también en el documento de Symfony2:
Patxi, es la segunda vez que me encuentro eslomas buscando solución a algún problemilla técnico…. algo estas haciendo bien 😉
Jeje, gracias galleta!!!!