Kann ich einfach alle Cache-Tabellen abschneiden?
Sie sollten die Tabelle "cache_form" nicht abschneiden, da sie die Daten enthält, die von Drupal zur Validierung verwendet wurden. Wenn Sie diese Tabelle löschen, wird das aktuell vom Benutzer gesendete Formular ungültig und die Benutzer müssen das Formular erneut senden.
Es könnte einige andere Cache-Tabellen geben, die dazu führen, dass ein Modul seltsam agiert. Aus diesem Grund sollten Module, die zusätzliche Cache-Tabellen verwenden (deren Name im Allgemeinen mit "cache_" beginnt), hook_flush_cache () implementieren , um die Cache-Tabellen zurückzugeben, die aus Drupal gelöscht werden können und die dann mit dem folgenden Code aufgerufen werden: von 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()
ist die Funktion, die von system_clear_cache_submit () aufgerufen wird, dem Übermittlungsformular- Handler, der aufgerufen wird, wenn Sie auf der Seite mit den Leistungseinstellungen auf die Schaltfläche "Alle Caches löschen " klicken.
Während Cron-Tasks löscht system_cron () den Cache mit dem folgenden Code.
$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);
}
Als erstes Argument von cache_clear_all () lautet NULL
der in DrupalDatabaseCache :: clear () (Drupal 7) ausgeführte Code der folgende.
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);
}
}
Der Code entfernt nur die Zeilen, die nicht als permanent markiert sind und abgelaufen sind, aus den hook_flush_caches()
von Drupal zurückgegebenen Tabellen und aus verschiedenen von Drupal verwendeten Cache-Tabellen, einschließlich "cache_form". In "cache_form" sollten nicht zu viele Zeilen enthalten sein. In diesem Fall können Sie die Zeit zwischen zwei aufeinander folgenden Ausführungen der Cron-Tasks verkürzen oder den folgenden Code von einem benutzerdefinierten Modul ausführen.
cache_clear_all(NULL, 'cache_form');
Eine Alternative besteht darin, den Cache mithilfe des Devel- Moduls und des angezeigten Menü-Links manuell zu löschen .