drupal 7 – ¿Mejores prácticas para implementar el almacenamiento en caché personalizado?

Pregunta:

Para cada instancia de cada tipo de entidad, genero una cantidad de cachés, denominados así: [module_name]__[entity_type]__[entity_id]__[string_depending_on_where_the_cache_came_from]

Ahora, cada vez que se actualiza una entidad, quiero eliminar todos los cachés comenzando con el tipo de entidad y la identificación relevantes.

¿Cómo debo almacenar / borrar estos cachés?

Actualmente solo cache_set () , pero eso presenta un problema cuando quiero borrar, ya que no conozco los nombres de todos los cachés relevantes. ¿Es seguro eliminar las entradas de la caché con un db_delete ()?

Respuesta:

Para eliminar entradas de un caché, debe usar cache_clear_all () . La razón es que la implementación de caché usada no pudo usar una tabla de base de datos en la base de datos activa. Eso es lo que sucede con la clase DrupalDatabaseCache , pero no debería ser cierto para todas las clases.

Si observa _cache_get_object () (la función llamada por cache_get () y cache_set () ), notará que contiene el siguiente código.

  static $cache_objects; 
  if (!isset($cache_objects[$bin])) {
    $class = variable_get('cache_class_' . $bin);
    if (!isset($class)) {
      $class = variable_get('cache_default_class', 'DrupalDatabaseCache');
    }
    $cache_objects[$bin] = new $class($bin);
  }
  return $cache_objects[$bin];

La clase para la implementación de la caché podría ser diferente para cada almacén de la bandeja de caché, e incluso se podría cambiar la predeterminada.

El sistema de caché de estado de actualización privada explica exactamente por qué las funciones de caché normales no se utilizan en _update_cache_clear () , _update_cache_get () y _update_cache_set () . (El énfasis es mío).

Específicamente NO utilizamos la API de caché central para guardar los datos obtenidos sobre las actualizaciones disponibles. Es de vital importancia que este caché solo se borre cuando lo estamos poblando después de obtener con éxito los nuevos datos de actualización disponibles. El uso de la API de caché central da como resultado todo tipo de problemas potenciales que resultarían en intentar obtener datos de actualización disponibles todo el tiempo, incluso si un sitio tiene una "vida útil mínima de caché" (que es tanto mínima como máxima) definida, o si un sitio usa Memcache u otro sistema de caché conectable que asume cachés volátiles.

El módulo Update Manager todavía usa la tabla {cache_update}, pero en lugar de usar cache_set() , cache_get() y cache_clear_all() , existen funciones auxiliares privadas que implementan estas mismas tareas básicas pero aseguran que la caché no se borre prematuramente. y que los datos siempre se almacenan en la base de datos, incluso si se utiliza Memcache u otro backend de caché.

Update Manager tiene necesidades específicas que son necesarias porque intentar obtener información de actualización con demasiada frecuencia causaría problemas con los servidores de Drupal.org, considerando que Update Manager puede potencialmente obtener información de actualización de cualquier sitio que ejecute Drupal.

En su caso, podría usar [module_name]__[entity_type]__[entity_id]__[string_depending_on_where_the_cache_came_from] como ID de caché para un almacén de contenedor de caché único. En el caso de que necesite eliminar todas las entradas de una entidad, puede usar el siguiente código.

cache_clear_all("{$module}__{$entity_type}__{$entity_id}__", $bin, TRUE);

Si no puede obtener el valor para asignar a $module cuando está limpiando la caché, o si desea eliminar la entrada de la caché independientemente del módulo para el cual se almacenaron los datos, puede usar una ID de caché diferente, como [entity_type]__[entity_id]__[string_depending_on_where_the_cache_came_from] , o [entity_type]__[entity_id]__[module_name]__[string_depending_on_where_the_cache_came_from] . cache_clear_all() elimina todas las entradas de caché con una ID de caché comenzando con la cadena pasada como argumento, cuando $wildcard es TRUE y la ID de caché no es '*' . En este caso, la caché se borraría con el siguiente código.

cache_clear_all("{$entity_type}__{$entity_id}__", $bin, TRUE);

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım