Estructura y manejo de la cache

RECU-0279 (Recurso Referencia)

Descripción

Introducción

La creación de páginas de sitios web dinámicos requiere numerosos viajes a la base de datos para recuperar información para guardar el contenido, la configuración del sitio, el usuario actual, y así sucesivamente. El almacenar los resultados de estas operaciones costosas para su uso posterior es una de las formas más sencillas dentro de la aplicación de acelerar la velocidad de ejecución.

Drupal trae incorporada una API que maneja la caché de forma automática para los datos más básicos y ofrece una serie de herramientas para desarrolladores de Drupal que quieren para aprovechar la API para sus propios fines.

Conociendo que hay que cachear

Es importante recordar que la memoria caché es una compensación. El almacenamiento en caché grandes cantidades de datos aumentará rendimiento un poco, pero sólo en los casos en que es necesario en los casos que un área de datos específico se utilizan una segunda o tercera vez. Drupal posee la capacidad de realizar el almacenamiento en caché de una página pero sólo se utiliza para usuarios anónimos. Cuando hablamos de un site con usuarios registrados es muy habitual que los visitantes registrados requieren versiones personalizadas de páginas, y el almacenamiento en caché de la pagina pasa a ser mucho menos eficaz.

El almacenamiento en caché de fragmentos de datos más pequeños (por ejemplo, la lista de los artículos populares de la actualidad) significa menos ganancia en rendimiento, pero ayuda a acelerar su sitio. El almacenamiento en caché funciona mejor en datos que no cambian con rapidez. Una lista de las principales noticias de la semana funciona bien, sin embargo el almacenamiento en caché una lista de los últimos cinco comentarios publicados en un foro ocupada es menos útil, debido a que la información se vuelve obsoleta tan rápidamente que pocos visitantes podrán utilizar la lista en caché antes de que se deba actualizar. En el peor de los casos, una estrategia de almacenamiento en caché de mala (Por ejemplo, el almacenamiento en caché los datos que cambian con demasiada frecuencia) añadirá sobrecarga a un sitio en lugar de reducirla.

Como funciona la cache en Drupal

Los Módulos a menudo tienen que hacer consultas costosas a la base de datos o llamadas a servicios Web remoto. En lugar de utilizar los recursos para estas operaciones cada vez que ocurren, los módulos puede almacenar una caché de sus datos en unas tablas reservados de la base de datos para almacenar en caché en la base de datos que contiene el Drupal, o pueden crear su propia tabla y almacenar los datos allí. La próxima vez que los datos sean necesarios, se puede recuperar rápidamente con una sola consulta.

En Drupal el caché final es pluggable, por lo que aunque nos referimos a las tablas de base de datos aquí, en la realidad el back-end pueden ser algunos de tipos de almacenamiento tales como archivos planos o una memoria caché basado en memoria.

La tabla por defecto a la que el módulo puede escribir información almacenada en caché se denomina named cache. El uso de esta tabla es la mejor opción cuando almacene sólo un par de filas de información en caché. Si pretende almacenar en caché información para cada nodo, un menú o un usuario, quiere que su módulo tenga su propia tabla dedicada de cache. Esto mejorará el rendimiento, reduciendo al mínimo el número de filas en la tabla de caché de Drupal y la reducción de escrituras.

Al definir una tabla nueva de caché para el modulo en uso, es necesario que sea estructuralmente igual a la tabla de cache por defecto pero con un nombre distinto para cada tabla

Estructura de la tabla de cache

La tabla de cache tiene una estructura definida que sigue el siguiente modelo:

  • Existe una columna que almacena el identificador para una recuperación rápida. Este identificador debe de ser único para cada elemento cacheado.
  • La columna de datos almacena la información que se quiere cachear. Los datos de tipo complejo como los objetos o los arrays deben de ser serializados haciendo uso del método de PHP, serialize() para preservar su estructura de datos en la base de datos
  • La columna que indica el tiempo de expiracion del dato que tendrá alguno de los siguientes valores:
    • CACHE_PERMANENT: Que indica que el dato se mantenga en cache hasta que se limpie mediante cache_clear_
    • CACHE_TEMPORARY: indica que el objeto se eliminará cuando se ejecute cache_clear_all()
    • Un timestamp: Indica que el dato debe mantenerse al menos hasta que se supere el tiempo indicado en la variable, después se puede eliminar.
  • La columna header es para almacenar la cabecera HTTP de la respuesta cuando los datos a cachear son una página entera. La mayoría del tiempo, no conviene usar el campo cabecera,el almacenamiento en caché de datos que no se basa en los encabezados, como partes de la página en lugar de toda la página en sí mismo. Tenga en cuenta, sin embargo, que la estructura de tabla de caché aún deben ser idénticos a la tabla de la caché por defecto, a fin de mantener la columna en torno a las cabeceras, aunque no se esté utilizando.
  • La columna serialized indica si los datos en la columna de datos está en serializados en el formulario. El valor 0 indica datos no serializados, mientras que un 1 indica los datos serializados. Si los datos se serializan y el valor de la columna de serialized es 1, el sistema de caché no serializa los datos antes de devolverla a la persona que llama. El sistema de cache automáticamente serializa objetos y datos de la red y establece la columna serializado a 1 cuando este tipo de datos se almacena en caché.

Como se utiliza la cache en el core de Drupal

Drupal posee seis tablas de caché de forma predeterminada:

  • cache almacena una copia de las variables de tabla y el esquema de base de datos y registro del theme;
  • cache_block almacena en caché copias de los bloques;
  • cache_menu almacena en caché copias de los menús de navegación
  • cache_filter copias en caché de cada nodo de contenido después de haber sido analizado por el sistema de filtro;
  • cache_form es utilizado por el formulario de la API para evitar la construcción del formulario cuando sea posible
  • cache_page copias almacenadas en caché de páginas para usuarios.
El sistema de cache de menú

El sistema de menús cachea la información del router que conecta las rutas de Drupal para los callbacks. Cualquier menú creado por el módulo de menú está en cache,ignorando si la caché de la página de Drupal esta habilitada o no. Así que para borrar la caché de menú, utilice la llamada al método menu_cache_clear_all(). Si se han hecho cambios en los menús que afectarán a los bloques, es posible que desee llamar función menu_rebuild(),el caché de menú se borra cuando se reconstruyen los menús.

El sistema de cache de filtro

Cuando se crea o se edita un nodo, el contenido se ejecuta a través de varios filtros asociados al formato de entrada. Por ejemplo el filtro de formato HTML convierte el texto a las etiquetas necesarias y elimina código malicioso. Podría ser una operación costoso hacer esto para cada nodo. Los filtros se aplican al nodo justo de que se cree o se edite, y el contenido es cacheado a la tabla cache_filter de la base de datos , este o no activado el sistema de cacheo de página.

La caché de filtro es la razón por la que los cambios en la longitud predeterminada de los nodo teaser dentro de los órganos de la interfaz de administración entran en vigor sólo después de que vuelva a guardar cada nodo. Una solución rápida para este problema es vaciar la tabla cache_filter para que todos el contenido del nodo se analiza y los teasers son construidos de nuevo.

El sistema de administración

Drupal almacena la configuración de la mayoría de los administración en la tabla de cache. realiza un cacheado de las variables y los datos para acelerar la búsqueda de datos de configuración. Ejemplos de variables cacheadas son el nombre de su sitio, configuración de comentarios y usuarios, y la ubicación del directorio de archivos.

Estas variables se almacenan en caché en una sola fila en la tabla de la caché, por lo que puede ser rápidamente recuperada,en lugar de hacer una consulta de base de datos para cada valor de la variable en que sea necesario. Ellos se almacenan como un array de PHP, por lo que el valor de caché se serializa para preservar su estructura. Cualquier variable que utiliza variable_set() y variable_get() como sus funciones setter y getter serán almacenados en cache de esta manera.

El sistema de cache de página

La mayor optimización de Drupal es almacenar en memoria caché una vista de página completa. Para los usuarios anónimos, esta se logra fácilmente, ya que todos los aspecto de las páginas el mismo para todos los usuarios anónimos. Para los usuarios registrados, sin embargo, cada página es diferente y personalizada a cada uno de sus perfiles. Una estrategia de almacenamiento en caché diferente es necesaria para hacer frente a esta situación.

Para los usuarios anónimos, Drupal puede recuperar el contenido almacenado en caché de página en una sola consulta, a pesar de que lleva un par de consultas mas la carga Drupal en si mismo. Se puede elegir una de los dos estrategias para el almacenamiento en caché de la caché de página de usuario anónimo: Normal o agresivo. También se puede deshabilitar el almacenamiento en caché. Las estrategias normal y agresivas podrían ser modificados posteriormente mediante el establecimiento de un tiempo de vida de cache mínimo. Aunque se desactive el cacheado de pagina, Drupal sigue cacheando los menús, los contenidos de los filtros, el registro del theme. Este nivel de cacheado no puede deshabilitarse.

La estrategia normal

El almacenamiento en caché de página con estrategia normal brinda un aumento de rendimiento enorme sobre el almacenamiento en caché no en todos, y es uno de los maneras más fáciles para acelerar un sitio de Drupal lento. Veamos a través del ciclo de vida cuando la solicitud normal del sistema de caché está habilitada.

Para comprender el almacenamiento en caché Normal página,se necesita conocer primero el sentido del proceso Drupal bootstrapping. El proceso de bootstrapping se compone de pequeños pasos, aislados llamados fases. Drupal se aprovecha de este arranque del sistema por fases para cargar y analizar sólo la cantidad de código necesario para atender a una página almacenada en caché, y para mantener las consultas de base de datos a un mínimo.

drupal_bootstrap() se encarga de la ejecución de cada fase de arranque. Para el almacenamiento en caché normal, sólo tenemos que preocuparnos por la fase del sistema de arranque DRUPAL_BOOTSTRAP_LATE_PAGE_CACHE . Esta fase comienza con la recuperación de las variables del sistema de la base de datos. Suponiendo que el estrategia de caché es normal, el siguiente paso es incluir" includes module.inc" que son las funciones que permite Drupal para poner el sistema de módulos.

Ese momento, Drupal inicializará los módulos que implementan hook_boot () o hook_exit (). La activación de estos ganchos se logra con bootstrap_invoke_all ('boot') y bootstrap_invoke_all ("salida"), respectivamente. El módulo de estadísticas, por ejemplo, utiliza el statistics_exit () para las visitas a las páginas. El módulo acelerador(throttle) usa el throttle_exit () para modificar el nivel de aceleración basado en los niveles de tráfico actuales.

Estrategia agresiva

El almacenamiento en caché agresivo sobrepasa completamente la carga de todos los módulos. Esto significa que el arranque y los enganches de salida (hooks) nunca son llamados para las páginas en caché. El resultado final es menos código PHP para analizar, ya que no se cargan los módulos. También hay menos consultas de base de datos para ejecutar. Si tiene módulos habilitados que utilizan estos ganchos (como el módulo de estadísticas y el módulo acelerador), no puede funcionar correctamente cuando el caché está habilitado en estrategia agresiva.

Tiempo de vida mínimo

Esta opción controla la vida del contenido de la caché de su sitio. Cuando un usuario envía nuevos contenidos,siempre será vera los cambios inmediatamente, sin embargo, todos los demás los usuarios tendrán que esperar hasta el tiempo de vida mínimo de caché expire para ver el nuevo contenido. Por supuesto, si la vida de cache mínima se establece en "ninguno", todo el mundo siempre va a ver nuevo contenido inmediatamente.

Cache de bloque

Dependiendo del contenido, los bloques pueden ser cacheables. La opción de configuración puede esta habilitada o deshabilitada ne función del contenido. El cacheado de bloques se consigue si se declara como cacheable por parte del módulo al responder a la llamada de la operación de lista hook_block().

function user_block($op = 'list', $delta = 0, $edit = array()) {
 global $user;
 if ($op == 'list') {
   $blocks[0]['info'] = t('User login');
    // Not worth caching.
   $blocks[0]['cache'] = BLOCK_NO_CACHE;
   $blocks[1]['info'] = t('Navigation');
   // Menu blocks can't be cached because each menu item can have
   // a custom access callback. menu.inc manages its own caching.
   $blocks[1]['cache'] = BLOCK_NO_CACHE;
   $blocks[2]['info'] = t('Who\'s new');
   // Too dynamic to cache.
   $blocks[3]['info'] = t('Who\'s online');
   $blocks[3]['cache'] = BLOCK_NO_CACHE;
 return $blocks;
 }
...
}

En el ejemplo todo los bloques han sido declarados como no cacheables excepto el bloque “Who’s new” que no ha declarado preferencia sobre la cache. Esto se implica que si el administrador tiene establecido el cacheo de bloques , recibirá el tratamiento establecido para el cacheo de bloques. Los posibles valores de de la constante para el cacheo de bloques son los siguientes:

  • BLOCK_NO_CACHE -1 D, no cachea el bloque
  • BLOCK_CACHE_PER_ROLE 1, cada rol tiene un bloque cacheado separado
  • BLOCK_CACHE_PER_USER 2 cada usuario tiene su bloque cacheado
  • BLOCK_CACHE_PER_PAGE 4 , cada pagina tiene su bloque cacheado
  • BLOCK_CACHE_GLOBAL 8 los bloques son cacheados para todos los usuarios

Todos los bloques que se almacenan en caché se almacenan en caché en un esquema por el tema (theme) y para cada idioma. Esto evita que que los usuarios vean un bloque que tiene como tema un tema distinto del que el usuario está debería de ver cuando están habilitadas múltiples temas, y evita que los bloques se muestren en el idioma incorrecto cuando varios idiomas están habilitadas.

Manejo de la API de Cache

Para desarrollar se tienen dos funciones dentro de la Api de Cache que se necesitan conocer:cache_set() and cache_get().

Cacheando datos con cache_set()

cache_set() se usa para escribir datos en la cache. La función tiene la siguiente estructura: cache_set($cid, $table = 'cache', $data, $expire = CACHE_PERMANENT, $headers = NULL) y los parámetros son:

  • $cid: Identificador único que actúa como clave para los datos
  • $table: El nombre de la tabla donde se almacenan los datos.
  • $data: Los datos que se almacenan en la tabla. Los objetos PHP y los arrays son serializados.
  • $expire: El tiempo que debe de permanecer como mino en cache el dato.
  • $headers: para cache de pagina, una secuencia de las cabeceras HTTP que se pasan a lo largo del visor.

Obteniendo datos con cache_get()

cache_get() es una función que permite obtener datos de la cache.Tiene la siguientes estructura: cache_get($cid, $table = 'cache') y los parámetros de la función son los siguientes:

  • $cid: El identificador de cache de los datos a retirar.
  • $table: El nombre de la tabla donde se retiraran los datos.

Buenas prácticas y recomendaciones de uso

  • Definir el tiempo mínimo de vida en cache.
  • Definir el tipo de estrategia para el cache de pagina
  • Asegurar que cada tabla nueva de caché para el modulo en uso, sea estructuralmente igual a la tabla de cache por defecto pero con un nombre distinto para cada tabla

Ejemplos

  • Consultar los ejemplos introducidos dentro del recurso.