Saltar al contenido

Drupal: ¿hay alguna forma de conectarse con la limpieza de caché?

La guía o código que verás en este post es la solución más fácil y válida que encontramos a esta duda o dilema.

Solución:

La forma de hacer esto es usar hook_flush_caches en combinación con register_shutdown_function. Código de ejemplo:

/**
 * Implements hook_flush_caches().
 */
function mymodule_flush_caches() 
   // After caches are cleared we will run mymodule_cache_rebuild()
   register_shutdown_function('mymodule_cache_rebuild');

   // We don't want to add any custom cache-tables, so just return an empty array
   return array();


/**
 * Rebuild expensive cache items that need to be rebuilt immediately.
 */
function mymodule_cache_rebuild() 
  // Do the cache rebuild work here

Usando register_shutdown_function significa que nuestra función de reconstrucción de caché se llamará después los cachés han sido borrados. estamos abusando hook_flush_caches de una manera que nunca fue pensada para ser utilizada, pero esto debería hacer exactamente lo que necesita.

No, no lo hay. Realmente no. Al menos no en 6 o 7. Suponiendo 7:

si miraras drupal_flush_all_caches() verás que invoca hook_flush_caches(). Este gancho está destinado a:

"agregue nombres de tablas de caché a la lista de tablas de caché que se borrarán con el botón Borrar en la página Rendimiento o siempre que se invoque drupal_flush_all_caches".

Sería tentador simplemente hacer que el gancho de su módulo fuera el último y escribir código allí. Pero echemos un vistazo de nuevo a drupal_flush_all_caches(). La eliminación real ocurre así:

  $cache_tables = array_merge(module_invoke_all('flush_caches'), $core);
  foreach ($cache_tables as $table) 
    cache_clear_all('*', $table, TRUE);
  

Significa que todos los anzuelos están disparados. antes de todo se aclara realmente. Solo hay una función llamada después de la eliminación real, _system_update_bootstrap_status()pero solo llama hook_boot, hook_exit, hook_watchdog y hook_language_init - ganchos que no desea implementar solo para proporcionar una funcionalidad dependiente del borrado de caché.

A grandes rasgos aquí:

Si bien no hay un enlace en la versión anterior a D8, puede escribir su propio backend de base de datos basado en el estándar DrupalDatabaseCache uno y luego escriba cualquiera o todos los tipos de lógica en su clear() función. Una mirada rápida sugeriría que esto es razonablemente sencillo en D7 (solo copie la clase a su nombre personalizado y modifíquelo, etc. lanzando un module_invoke_all() según corresponda) y con el módulo cache_backport incluso funcionaría en D6. Luego, apunte a los contenedores de caché que desee que estén limpios y debería estar en camino.

Valoraciones y comentarios

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada.