Introducción a la cache

Introducción a la cache

Publicado Por | 24 abril , 2013 | Blog Adrenalina | No Comments

Para los poco habituados al concepto de cache, podríamos decir que se trata de un sistema para agilizar la respuesta de nuestras páginas web y disminuir la carga del servidor, evitando repetir la ejecución del mismo código varias veces innecesariamente.

Es decir, en la carga de páginas web, especialmente si son dinámicas, existe un tiempo de espera para el usuario, mientras se procesa la página y se devuelve la petición. El objetivo siempre debe ser reducir al máximo este tiempo de espera, ya que si un usuario cree que espera mucho, lo más probable es que abandone la página. Si el objetivo de nuestra página es vender o hacer negocio, probablemente habremos perdido un cliente potencial.

La cache se basa en guardar copias del contenido o parte del contenido ya generado que hay que devolver al cliente. De esta manera, si se recibe una segunda petición pidiendo el mismo contenido, será la cache quien lo devuelva, reduciendo el tiempo de espera y la carga del servidor.

Podemos separar la cache en dos grupos generales:

  • Cache de contenido
  • Cache de código

Cache de contenido

En este grupo tenemos las caches de navegador y caches de proxy. Las caches de navegador son controladas y guardadas por el propio navegador del cliente, y las de proxy por algún nodo intermedio entre el cliente y el servidor, generalmente usadas por los ISP’s.
También podemos incluir en este grupo las caches de gateway, típicamente localizadas en balanceadores de carga.

Este tipo de caches se basan en guardar una copia de la página y de las imágenes y otros archivos de la página pedida por el usuario. Esta copia tendrá un tiempo de validez, como veremos más adelante. De esta manera, cuando un usuario pide la misma página más de una vez, o regresa a páginas anteriores con el botón de ‘atrás’, se muestra la copia, en lugar de volver a pedirla. Dependiendo del nivel de cache, esta va a afectar a un usuario, en el caso de la de navegador, o a un grupo de usuarios en el caso de proxy o gateway.

La manera en la que podemos controlar estas versiones guardadas es usando los meta tags de html y las cabeceras http. Los meta tags son fáciles de incluir, ya que simplemente podemos añadir ciertos metas dentro de la cabecera de las páginas, aunque estos normalmente no son tomados en cuenta por los proxy caches. Las cabeceras http nos permiten más control sobre nuestra página, ya que son enviadas por el servidor antes del código html y son consultadas por los navegadores y proxys. Los elementos más significativos para el control de la caché son:

Expires

Permite definir la fecha en la que este contenido (ya sea una web entera, una imagen, etc.) ‘caduca’. Hasta esa fecha, se usará siempre el contenido cacheado, pero una vez superada, se verificará si el contenido ha cambiado para saber si la versión guardada continúa siendo la última. En los siguientes apartados veremos cómo definir si el contenido ha cambiado. El valor de esta cabecera será una fecha en formato http, por ejemplo:

Expires: Wed, 24 Apr 2013 14:19:41 GMT

Es recomendable calcular la fecha en la que expira un contenido, ya que si lo tenemos fijado en código, al pasar esta fecha el contenido siempre sería considerado caducado y se realizaría siempre la petición para consultar si se ha modificado. En PHP podemos controlar esta cabecera usando la función header. Por ejemplo, para marcar un contenido con fecha de caducidad 1 día haríamos:

<?php
header(‘Expires: ‘ . gmdate(‘D, d M Y H:i:s’, time()+24*60*60) . ‘ GMT’);
?>

Cache-Control

Permite dar más información sobre como se debe comportar la cache con este contenido. Esta cabecera sobrescribe la cabecera expires, al ser más específica. Podemos configurar diferentes atributos de esta cabecera para ajustarla a nuestras necesidades. Por ejemplo, podemos definir la expiración en 1 hora con la cabecera:

Cache-Control: max-age=3600

Last-Modified y ETag

Estas cabeceras son las que permiten al navegador o proxy decidir si el contenido que tienen guardado ha cambiado, si ya está caducado. Last-Modified informará de la fecha de última modificación del contenido y el ETag es un identificador único del contenido, que tiene que cambiar si el contenido cambia. De esta manera, una vez pasada la fecha que Expires o Cache-Control define un contenido como caducado, estas dos cabeceras ayudarán a decidir si hay que volver a cargar el contenido.

Caché de código

Este grupo se refiere a las acciones que podemos realizar en la programación de nuestras páginas web para evitar ejecutar código repetido para peticiones similares o iguales. Se basa en reutilizar código ya generado previamente basándonos en unas claves que identifiquen a una copia única.

Es decir, si tenemos un archivo php que devuelve una página con el detalle de un producto recibido como parámetro (o indicado en una url amigable), podríamos definir que necesitaremos una copia diferente del código html generado para cada producto, y definiríamos el identificador del producto como clave. Es importante saber identificar qué elementos nos diferencian las versiones de nuestro código en cada momento.

Además, podemos definir caché de código a diferentes niveles según las necesidades de la página. Es decir, podemos guardarnos una copia del contenido html generado para toda la página, según su clave, o guardar una copia de una porción de código común en diferentes páginas, como una cabecera, o una zona de banners, o incluso podemos guardar una copia del resultado de consultas a base de datos, de manera que no tengamos que realizar la misma consulta diferentes veces si va a devolver el mismo resultado. En este caso, será fácil definir la clave de la cache como los parámetros que usemos en la consulta, o incluso el texto de la consulta en si.

En este tipo de cachés, es muy importante no solo la clave que definimos, sino también la renovación de las cachés. Si cambia un producto en la base de datos, las cachés que tengan guardado ese producto se tendrán que renovar para mostrar la nueva información al usuario.

Existen diferentes sistemas en PHP para trabajar con cachés en nuestro código. Es importante realizar un buen análisis antes de decidirnos por uno en concreto, ya que según las necesidades de nuestra aplicación, puede que un sistema nos beneficie o nos perjudique. Hay sistemas de caché que guardan las copias en base de datos o en fichero. También hay sistemas como memcached que almacenan las copias en memoria, para agilizar al máximo su acceso.

En próximos posts, profundizaremos en las cachés de código, en PHP, así como comparativas entre sistemas o uso de memcached.

Curiosidades

Las caches no solo son usadas por los navegadores para que los usuarios tengan que esperar menos. Incluso los buscadores como Google guardan copias de las webs para mejorar sus sistemas de búsqueda. Esto puede ser útil en algunos casos inesperados.

Autor: Marçal Panareda

Estudiamos y analizamos su negocio en profundidad, definimos objetivos y planteamos la estrategia de marketing más adecuada centrándonos en conseguir cada uno de los objetivos propuestos. Solicita Presupuesto Ahora

Uso de cookies

En este sitio web utilizamos cookies propias y de terceros para mejorar nuestros servicios, para que usted tenga la mejor experiencia de usuario y analizar su visita. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.