Cache löschen löscht die Cache-Tabellen nicht?

11

Ich verstehe die Aktion "Cache löschen" nicht vollständig. Ich klicke einfach in Cache löschen Alle Caches löschen in: admin / config / development / performance, dann gehe ich zur Datenbank, um alle Cache-Tabellen zu überprüfen, und stelle fest, dass keine von ihnen leer ist.

Ist das normal?
Kann ich einfach alle Cache-Tabellen abschneiden?

Tatsächlich muss ich nur cache_form löschen. Kann ich diese Tabelle abschneiden?

Chefnelone
quelle

Antworten:

13

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

Bildschirmfoto

kiamlaluno
quelle
Mein Problem ist, dass die Tabelle cache_form eine Größe von 63 MB für eine Website hat, die erst seit 2 Tagen in Produktion ist. Meine Angst ist, dass dieser Tisch ohne Kontrolle wachsen wird ...
Chefnelone
1
Wenn Sie cron eingerichtet haben, sollten abgelaufene Einträge aus allen Caches (einschließlich cache_form) bei jeder Ausführung gelöscht werden.
mpdonadio
1
@chefnelone Wie kiamlaluno erklärte, sollte diese Tabelle regelmäßig gelöscht werden, wenn Sie Ihren Cron richtig eingerichtet haben.
Amateur Barista
2
@kiamlaluno, das Lesen dieser Antwort ist sehr informativ und praktisch, eine praktische Kurzreferenz für Dornen im Zusammenhang mit dem Cache. 1+
Amateur Barista
Wie du gesagt hast, ich bekomme Cron zum Laufen und der Tisch wurde abgeräumt. Vielen Dank.
Chefnelone
6

Wenn Sie den Cache über die Benutzeroberfläche leeren, wird der Cache nach dem erneuten Laden der Seite wieder voll. Mit anderen Worten, das Aktualisieren dieser Seite führt dazu, dass Drupal (insbesondere cache_menu) erneut beginnt, Dinge zwischenzuspeichern .

Sie können DELETE FROM cacheauf den verschiedenen Tischen sicher.

Ich bin mir auch ziemlich sicher, dass das Ausführen von a drush cc allauch zu vollständig leeren Cache-Tabellen führt.

mpdonadio
quelle
Danke, nur um sicherzugehen, dass ich nur cache_form löschen muss. Kann ich diese Tabelle abschneiden?
Chefnelone
4
Wenn Sie den Code für api.drupal.org/api/drupal/includes%21common.inc/function/… lesen, werden Sie feststellen, dass cache_form nicht gelöscht wird und warum. Wenn Sie sind positiv , dass dies in Ordnung ist , dann sollten Sie in der Lage sein , dies zu tun. Es gab einige historische Fehler, bei denen cache_form keine Einträge ablief und ohne Bindung wuchs.
mpdonadio