¿Borrar caché no borra las tablas de caché?

11

No entiendo completamente la acción Clear Cache. Simplemente hago clic en borrar caché Borrar todas las cachés en: admin / config / development / performance, luego voy a la base de datos para verificar todas las tablas de caché _... y encuentro que ninguna de ellas está vacía.

¿Esto es normal?
¿Puedo truncar todas las tablas de caché _...?

De hecho, solo necesito borrar cache_form. ¿Puedo truncar esta tabla?

chefnelone
fuente

Respuestas:

13

¿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.

captura de pantalla

kiamlaluno
fuente
mi problema es que la tabla cache_form tiene un tamaño de 63Mb para un sitio web que ha estado en producción por SOLO 2 días. Mi temor es que esta mesa crezca sin control ...
chefnelone
1
Si ha configurado cron, las entradas caducadas de todos los cachés (incluido cache_form) deberían borrarse cada vez que se ejecute.
mpdonadio
1
@chefnelone Como explicó kiamlaluno, si tiene su cron configurado correctamente, esta tabla debería borrarse periódicamente.
barista aficionado
2
@kiamlaluno, leer esta respuesta es muy informativo y práctico, una referencia rápida y útil para espinas relacionadas con caché. 1+
barista aficionado
Como dijiste, ejecuté cron y la mesa quedó despejada. Gracias.
chefnelone
6

Si está borrando la memoria caché a través de la interfaz de usuario, tan pronto como la página se vuelva a cargar, la memoria caché comenzará a llenarse nuevamente. En otras palabras, el acto de actualizar esa página hace que Drupal comience a almacenar en caché las cosas nuevamente (especialmente cache_menu).

Puede DELETE FROM cacheen las diferentes mesas de forma segura.

También estoy bastante seguro de que hacer esto también drush cc allgenerará tablas de caché completamente vacías.

mpdonadio
fuente
Gracias, solo para asegurarme de que solo necesito borrar cache_form. ¿Puedo truncar esta tabla?
chefnelone
44
Si lee el código de api.drupal.org/api/drupal/includes%21common.inc/function/… , verá que cache_form no se borra y por qué. Si está seguro de que esto está bien, entonces debería poder hacerlo. Ha habido algunos errores históricos con cache_form que no vencen las entradas y crecen sin límite.
mpdonadio