web-dev-qa-db-fra.com

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

Je ne comprends pas bien l'action Vider le cache. Je clique simplement dans le cache clair Effacer tous les caches dans: admin/config/development/performance, puis je vais dans la base de données pour vérifier toutes les tables du cache _... et je trouve qu'aucune d'entre elles 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?

11
chefnelone

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 à partir de Drupal pour les valider; si vous supprimez cette table, le formulaire actuellement soumis par l'utilisateur serait invalidé, et les utilisateurs devront 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 est puis appelé 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 en utilisant le 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 par 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 à effacer manuellement le cache, en utilisant le module Devel , et le lien de menu qu'il affiche.

screenshot

13
kiamlaluno

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 provoque Drupal pour recommencer à mettre en cache les choses (en particulier cache_menu).

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

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

6
mpdonadio