Ver índice de contenidos del libro

22.3. Guardando páginas en la cache

Como la portada de Jobeet será la página más visitada de todo el sitio, no vamos a obtener los datos de la base de datos cada vez que un usuario visita la página, sino que la vamos a guardar en la cache.

Crea un archivo llamado cache.yml para el módulo sfJobeetJob:

# plugins/sfJobeetJob/modules/sfJobeetJob/config/cache.yml
index:
  enabled:     on
  with_layout: true

Nota El archivo de configuración cache.yml tiene las mismas propiedades que cualquier otro archivo de configuración de Symfony como por ejemplo view.yml. Por tanto, puedes activar la cache para todas las acciones de un módulo utilizando el valor especial all.

Si recargas la página en el navegador, verás que Symfony ha añadido una caja en la esquina superior izquierda de la página indicando que su contenido se ha guardado en la cache:

Caja que indica que el contenido se ha guardado en la cache

Figura 22.1 Caja que indica que el contenido se ha guardado en la cache

La caja incluye información muy útil para depurar el funcionamiento de la cache, como por ejemplo su tiempo de vida total y su tiempo de vida actual.

Si vuelves a refrescar la página, verás que la caja de la cache ahora se muestra de color amarillo, lo que indica que la página se ha obtenido directamente de la cache:

Caja que indica que el contenido se ha obtenido de la cache

Figura 22.2 Caja que indica que el contenido se ha obtenido de la cache

Si te fijas bien en este segundo caso, verás que la barra de depuración web muestra que no se ha realizado ninguna consulta a la base de datos.

Nota Aunque cada usuario puede cambiar el idioma de la página, la cache sigue funcionando porque el propio idioma de la página se incluye como parte de la URL.

Cuando una página se puede guardar en la cache, Symfony comprueba si ya existía en la cache. En el caso de que no exista, Symfony almacena en la cache el objeto de la respuesta después de enviar la respuesta al usuario. En las siguientes peticiones la respuesta ya se encuentra en la cache, por lo que Symfony envía directamente la respuesta sin ni siquiera llamar a la parte del controlador:

Flujo de trabajo al guardar una página en la cache

Figura 22.3 Flujo de trabajo al guardar una página en la cache

Este pequeño cambio tiene un impacto enorme en el rendimiento del sitio web, tal y como puedes comprobar tu mismo con herramientas como JMeter.

Nota Si la petición del usuario contiene parámetros GET o se envía con los métodos POST, PUT o DELETE, Symfony nunca la guarda en la cache, independientemente de la configuración de la página.

El formulario de publicación de una nueva oferta de trabajo también se puede guardar en la cache:

# plugins/sfJobeetJob/modules/sfJobeetJob/config/cache.yml
new:
  enabled:     on

index:
  enabled:     on

all:
  with_layout: true

Como las dos páginas se pueden guardar enteras en la cache (incluso con el layout) hemos creado una sección especial de tipo all para establecer la configuración por defecto de todas las acciones del módulo sfJobeetJob.