Pasar al contenido principal

Optimizando el Rendimiento de Drupal - Internal Page Cache

The Internal Page Cache es un módulo del núcleo de Drupal que se encarga de almacenar en caché las páginas solicitadas por usuarios anónimos.

Cuando una página está en caché y un usuario anónimo realiza una nueva solicitud, Drupal no necesita ejecutar ningún proceso de renderización o construcción de la página. Simplemente recupera la página renderizada de la caché y la envía al cliente.

El motivo por el que solo se aplica a usuarios anónimos y no a usuarios autenticados es porque la página que se devuelve al cliente debe tener exactamente el mismo contenido para todos los usuarios. 

En el caso de usuarios autenticados, aunque parte del contenido pueda ser igual para todos, siempre hay elementos que pueden variar, como el bloque de usuario que muestra el nombre del usuario, o información  específica, por ejemplo, sus últimas publicaciones. 

Para estos casos, existe el módulo Dynamic Page Cache, que gestiona el almacenamiento en caché tanto para usuarios anónimos como para usuarios autenticados.

Funcionamiento

Cache Bin

Para el almacenamiento y gestión de las páginas en caché, Internal Page Cache define su propio cache bin denominado “Page”, es decir, que los objetos cacheados se almacenan de manera independiente al resto de sistemas de caché existentes en Drupal.

Image
Page Cache bin definition

 

Si accedemos a la base de datos de una instalación en el que esta activado el módulo, y no se utiliza ningún sistema de caché en memoria (como Redis o Memcache), veremos una tabla llamada “page_cache”. 

En esta tabla se almacenan los objetos de respuesta cacheados. Se compone principalmente de las siguientes columnas:

  • CID: La URL del objeto de respuesta cacheado, utilizada como identificador único para recuperar el objeto de la caché.
  • DATA: Almacena el objeto de respuesta serializado.
  • EXPIRE: La fecha de expiración del objeto en caché. Por defecto, será -1, lo que indica que no tiene fecha de expiración.
  • TAGS: Las cache tags de todos los componentes que forman la página. De este modo, si alguno de estos componentes se modifica, se invalida el objeto en caché para reconstruir la página por completo.
  • CHECKSUM: Gracias a este campo, Drupal puede saber rápidamente si alguna de las cache tags asociadas al objeto ha sido invalidada.

    Image
    Page cache bin table

Middleware HTTP

Define su propio middleware (Middleware API) para interceptar la solicitud HTTP antes de que esta llegue al kernel principal.

Image
Middleware HTTP


A grandes rasgos, sin entrar en demasiados detalles en los diferentes procesos que realiza, este middleware se encarga de determinar si el response es apto para ser cacheado. Si lo es, verifica si existe un objeto en caché; si existe, lo devuelve, y si no, delega la generación del objeto response. Antes de devolver la respuesta al cliente, la almacena en caché para futuras solicitudes.

¿Cómo saber si una página está cacheada?

La manera de saber si una página está siendo cacheada por Internal Page Cache es consultar los headers del response en el inspector de nuestro navegador.

Cuando el módulo está activo, añade un nuevo parámetro a los encabezados de las respuestas que pueden ser cacheadas por él: “X-Drupal-Cache”.

Image
Headers response - Page cache

 

Por lo tanto, si visitas una página después de haber iniciado sesión, no verás este parámetro en los encabezados de la solicitud porque, como mencionamos antes, solo aplica para usuarios anónimos. En cambio, si la visitas como usuario anónimo, verás dicho parámetro.

Valores del parámetro X-Drupal-Cache:

  • MISS: Indica que no había un objeto en caché para esa respuesta cuando se realizó la solicitud, por lo que la página que se devuelve no proviene de la caché. La próxima vez que se realice una solicitud para esta misma página, el valor será HIT.
  • HIT: Indica que se está devolviendo una página cacheada.

Particularidades

Max Age

El parámetro Max Age no está activo para la Internal Page Cache. Esto significa que, incluso si establecemos un valor específico en el parámetro, la Internal Page Cache no considerará dicho valor y nunca invalidará ni regenerará el objeto en caché en función de este parámetro.

Una posible solución, si deseamos establecer una invalidación basada en Max Age, es crear una cache tag personalizado y asociarlo a los objetos en caché a los que queremos aplicar una determinada caducidad.

Luego, debemos configurar una cron job para ejecutarse en el intervalo deseado y así invalidar la cache tag.

Cache context

El cache context no se aplica a las páginas servidas a usuarios anónimos y almacenadas en caché por Internal Page Cache. Como  hemos visto, devuelve directamente el objeto cacheado, por lo que solo tendrá en cuenta los cache context en el momento de la construcción de la página antes de ser cacheada. 

Invalidación

Los únicos métodos para regenerar los objetos cacheadas por Internal Page Cache son invalidando los cache tags asociados con cada página en caché, o limpiando manualmente la cache.

Recomendaciones

Drupal.org recomienda habilitar este sistema de cache en sitios o instalaciones de tamaño pequeño a mediano. Si el sitio es grande o tiene mucho tráfico, se debe considerar la implementación de otras capas de almacenamiento en caché, como un proxy cache.

De hecho, si el módulo está habilitado y existe un proxy cache, habrá dos capas de caché realizando la misma función, por lo que se recomienda desactivar el Internal Page Cache. Para ello, solo habrá que deshabilitar el módulo.
 

Image
Luis Ruiz

Luis Ruiz

Senior Drupal Developer