Vider le cache n'efface pas les tables de cache?


11

Je ne comprends pas bien l'action Vider le cache. Je clique simplement dans le cache clair Effacez tous les caches dans: admin / config / development / performance, puis je vais dans la base de données pour vérifier toutes les tables de cache _... et je trouve qu'aucun d'eux n'est vide.

Est-ce normal?
Puis-je simplement tronquer toutes les tables de cache _...?

En fait, j'ai juste besoin d'effacer cache_form. Puis-je tronquer ce tableau?

Réponses:


13

Puis-je simplement tronquer toutes les tables de cache _...?

Vous ne devez pas tronquer la table "cache_form", car elle contient les données utilisées par Drupal pour les valider; si vous supprimez ce tableau, le formulaire actuellement soumis par l'utilisateur serait invalidé et les utilisateurs devraient soumettre à nouveau le formulaire.

Il peut y avoir d'autres tables de cache qui provoquent un comportement étrange d'un module. C'est la raison pour laquelle les modules qui utilisent des tables de cache supplémentaires (dont le nom commence généralement par "cache_") sont censés implémenter hook_flush_cache () pour renvoyer les tables de cache qui peuvent être effacées de Drupal, et qui sont ensuite appelées avec le code suivant, 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()est la fonction appelée depuis system_clear_cache_submit () , le gestionnaire de formulaire de soumission appelé lorsque vous cliquez sur le bouton "Effacer tous les caches", dans la page des paramètres de performances.

Pendant les tâches cron, system_cron () efface le cache à l'aide du code suivant.

  $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);
  }

Comme le premier argument de cache_clear_all () est NULL, le code exécuté dans DrupalDatabaseCache :: clear () (Drupal 7) est le suivant.

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);
  }
}

Le code supprime uniquement les lignes, qui ne sont pas marquées comme permanentes et expirées, des tables renvoyées hook_flush_caches()et des diverses tables de cache utilisées depuis Drupal, y compris "cache_form". Il ne doit pas y avoir trop de lignes dans "cache_form"; si cela se produit, vous pouvez réduire le temps écoulé entre deux exécutions consécutives des tâches cron ou exécuter le code suivant à partir d'un module personnalisé.

cache_clear_all(NULL, 'cache_form');

Une alternative consiste à vider manuellement le cache, à l'aide du module Devel et du lien de menu qu'il affiche.

capture d'écran


mon problème est que la table cache_form a une taille de 63 Mo pour un site Web qui est en production depuis JUSTE 2 jours. Ma crainte est que cette table grandisse sans contrôle ...
chefnelone

1
Si vous avez configuré cron, les entrées expirées de tous les caches (y compris cache_form) doivent être effacées à chaque exécution.
mpdonadio

1
@chefnelone Comme l'a expliqué kiamlaluno, si votre cron est correctement configuré, ce tableau devrait être effacé périodiquement.
barista amateur

2
@kiamlaluno, la lecture de cette réponse est très informative et pratique, une référence rapide et pratique pour les épines liées au cache. 1+
Barista amateur

Comme vous l'avez dit, je lance Cron et la table est vide. Merci.
chefnelone

6

Si vous effacez le cache via l'interface utilisateur, dès que la page se recharge, le cache recommence à se remplir. En d'autres termes, l'actualisation de cette page oblige Drupal à recommencer à mettre les choses en cache (en particulier cache_menu).

Vous pouvez DELETE FROM cachesur les différentes tables en toute sécurité.

Je suis également sûr que faire un drush cc allentraînera également des tables de cache entièrement vides.


Merci, juste pour être sûr que j'ai juste besoin d'effacer cache_form. Puis-je tronquer ce tableau?
chefnelone

4
Si vous lisez le code pour api.drupal.org/api/drupal/includes%21common.inc/function/… alors vous verrez que cache_form n'est pas effacé et pourquoi. Si vous êtes sûr que c'est OK, vous devriez pouvoir le faire. Il y a eu quelques bogues historiques avec cache_form n'expirant pas les entrées et augmentant sans limite.
mpdonadio
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.