Pasar al contenido principal

Lo que necesitas saber antes de activar el State Cache en Drupal 10.3

Seguramente hayas actualizado Drupal a la versión 10.3.0 y hayas notado en los reportes un nuevo mensaje acerca del State Cache:

State cache report

El mensaje dice lo siguiente:

La flag de State Cache $settings['state_cache'] no está activa. Se recomienda habilitarla en el settings.php a no ser de que se almacenen demasiadas claves. A partir de Drupal 11, State Cache estará habilitado por defecto.

¿Qué es el State API?

Comencemos entendiendo que es el State API. El State API en Drupal es un sistema que permite almacenar y recuperar pequeños fragmentos de datos que son necesarios para la operación del sitio, pero que no forman parte de la configuración general. A diferencia de la Config API, que se centra en datos que deben ser consistentes a través de diferentes entornos (como producción, desarrollo, etc.), la State API está destinada a datos específicos del entorno que pueden cambiar más dinámicamente y no necesitan sincronizarse entre diferentes entornos.

¿Por qué necesita ser cacheado?

Actualmente las entradas de State API se almacenan en la tabla 'key_value', si nunca has visto esta tabla, es un almacén genérico y flexible de tipo clave-valor que es ampliamente utilizado en Drupal para diversos propósitos de almacenamiento de datos, una gran caja de sastre. Esto significa que esta la tabla no está optimizada para su acceso y lectura.

El cambio principal es que `\Drupal\Core\State\State` ahora se extiende a `\Drupal\Core\Cache\CacheCollector`. Esto significa que los elementos del State API que más se consultan pueden ser recuperados más eficientemente desde la caché en lugar de realizar consultas frecuentes a la base de datos. Esto es particularmente beneficioso para sitios con un volumen de tráfico alto donde la eficiencia es clave para mantener un rendimiento óptimo.

¿Y si movemos toda la tabla de key_value a caché?

Dependiendo del sistema que usemos, el tamaño que se destina a la caché puede variar y es limitado, hacer un uso intensivo puede degradar el rendimiento del sitio, perjudicando la obtención de información que realmente es necesaria.

El State API de Drupal está diseñado para manejar pequeños fragmentos de datos que necesitan ser accedidos con frecuencia y que no cambian consistentemente a través de los entornos. Por ejemplo:

  • Flag de mantenimiento: Habilitar el mantenimiento del sitio.
  • Última ejecución de cron: Fecha y hora de la última ejecución de cron.
  • Datos para optimizar consultas de rutas: Información utilizada para mejorar el enrutamiento.

No obstante, ciertos usos no son óptimos para la State API. Por ejemplo, una `flag` de desarrollo que solo se accede durante una reconstrucción de contenedores debería evitarse, por ejemplo la depuración de twig. En su lugar, se debe usar el servicio de `key_value` para información de gran tamaño o que no requiere acceso frecuente con su debida colección.

Entonces, ¿Habilito el State cache y ya está?

Drupal da la opción de configurar la caché del State API para evitar problemas en sitios existentes con muchas entradas o de gran tamaño, esta característica debe habilitarse explícitamente mediante la flag de configuración:

$settings['state_cache'] = TRUE;

Esto garantiza que el sitio aproveche la nueva funcionalidad de caché. Si no se establece explícitamente, Drupal mostrará el mensaje de advertencia que hemos mencionado al principio. Es importante mencionar que en Drupal 11+, la caché de estado está activada permanentemente, eliminando la opción de configurar esta flag. 

¿Cómo sé si debería activarla?

Antes de activar esta opción tienes que verificar el uso actual del State API, se puede hacer usando la siguiente consulta en base de datos:

SELECT COUNT(*), SUM(LENGTH(value)) FROM key_value WHERE collection = 'state';

Si el entorno tiene más de 100 entradas o un tamaño total del valor superior a 100,000, considera revisar y optimizar las entradas específicas. Utiliza la siguiente consulta para obtener más detalles:

SELECT name, LENGTH(value) FROM key_value WHERE collection = 'state' 
ORDER BY LENGTH(value) DESC LIMIT 100;

¿Qué hago con las entradas demasiado grandes o que no encajan en el State API?

Cómo hemos comentado, las entradas de state API hasta ahora se almacenaban en la tabla 'key_value', si se desean mantener se puede cambiar la colección a la que pertenecen reemplazando el servicio de State API por el de 'key_value'.

Conclusión

Este cambio mejora significativamente la eficiencia y el rendimiento de los sitios de Drupal al optimizar el manejo de los elementos de estado mediante la caché. Aunque la mayoría de los desarrolladores no necesitarán hacer cambios en su código, es crucial revisar la configuración del sitio para asegurarse de que se aprovecha adecuadamente de estas nuevas capacidades. La optimización de consultas y la estructura de caché puede aportar grandes beneficios en la experiencia de los usuarios finales y la gestión de recursos del servidor.

Eduardo Morales Alberti

Eduardo Morales

Senior Drupal developer