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.
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 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.la source