¿Puedo truncar todas las tablas de caché _...?
No debe truncar la tabla "cache_form", ya que contiene los datos utilizados de Drupal para validarlos; si elimina esa tabla, el formulario que el usuario está enviando actualmente se invalidará y los usuarios deberán enviar el formulario nuevamente.
Podría haber algunas otras tablas de caché que hacen que un módulo actúe de manera extraña. Esa es la razón por la cual los módulos que usan tablas de caché adicionales (cuyo nombre generalmente comienza con "cache_") deben implementar hook_flush_cache () para devolver las tablas de caché que se pueden borrar de Drupal, y que luego se llama con el siguiente código, de drupal_flush_all_caches () .
$core = array('cache', 'cache_path', 'cache_filter', 'cache_bootstrap', 'cache_page');
$cache_tables = array_merge(module_invoke_all('flush_caches'), $core);
foreach ($cache_tables as $table) {
cache_clear_all('*', $table, TRUE);
}
drupal_flush_all_caches()
es la función llamada desde system_clear_cache_submit () , se llama al controlador de formulario de envío cuando hace clic en el botón "Borrar todas las cachés", en la página de configuración de rendimiento.
Durante las tareas cron, system_cron () borra el caché usando el siguiente código.
$core = array('cache', 'cache_path', 'cache_filter', 'cache_page', 'cache_form', 'cache_menu');
$cache_tables = array_merge(module_invoke_all('flush_caches'), $core);
foreach ($cache_tables as $table) {
cache_clear_all(NULL, $table);
}
Como el primer argumento de cache_clear_all () es NULL
, el código ejecutado en DrupalDatabaseCache :: clear () (Drupal 7) es el siguiente.
if (variable_get('cache_lifetime', 0)) {
// We store the time in the current user's $user->cache variable which
// will be saved into the sessions bin by _drupal_session_write(). We then
// simulate that the cache was flushed for this user by not returning
// cached data that was cached before the timestamp.
$user->cache = REQUEST_TIME;
$cache_flush = variable_get('cache_flush_' . $this->bin, 0);
if ($cache_flush == 0) {
// This is the first request to clear the cache, start a timer.
variable_set('cache_flush_' . $this->bin, REQUEST_TIME);
}
elseif (REQUEST_TIME > ($cache_flush + variable_get('cache_lifetime', 0))) {
// Clear the cache for everyone, cache_lifetime seconds have
// passed since the first request to clear the cache.
db_delete($this->bin)
->condition('expire', CACHE_PERMANENT, '<>')
->condition('expire', REQUEST_TIME, '<')
->execute();
variable_set('cache_flush_' . $this->bin, 0);
}
}
El código elimina solo las filas, que no están marcadas como permanentes y caducadas, de las tablas devueltas hook_flush_caches()
y de varias tablas de caché utilizadas desde Drupal, incluida "cache_form". No debería haber demasiadas filas en "cache_form"; Si eso sucede, puede reducir el tiempo transcurrido entre dos ejecuciones consecutivas de las tareas cron o ejecutar el siguiente código desde un módulo personalizado.
cache_clear_all(NULL, 'cache_form');
Una alternativa es hacer que el caché se borre manualmente, utilizando el módulo Devel y el enlace del menú que muestra.