Die Größe der Cache Form-Tabelle ist enorm

13

Die Größe der Cache-Tabelle hat sich im letzten Monat auf über 10 GB erhöht, und ich habe sie vorübergehend korrigiert, indem ich sie abgeschnitten habe. Als ich das letzte Mal nachgesehen habe, waren es ungefähr 1 GB. In ein paar Monaten werden es wieder 10 GB sein. Wie soll damit umgegangen werden?

Beachten Sie, dass ich alle Cron-Jobs auf dieser Site deaktiviert habe. Wenn dies der Grund ist, welches Cron sollte aktiviert werden?

GoodSp33d
quelle

Antworten:

24

Die {cache_form}Tabelle ist ein wenig lustig und verhält sich etwas anders als andere Cache-Tabellen.

Wenn Sie einen Blick darauf werfen, werden drupal_flush_all_caches()Sie feststellen, dass dies {cache_form}nicht geklärt ist. Dies dient dazu, laufende Formulare vor Kernwaffen zu schützen.

Die system_cron()Funktion sorgt dafür, dass alte Daten {cache_form}zusammen mit den anderen Cache-Tabellen gelöscht werden.

Sie sollten cron wirklich auf allen Drupal-Sites ausführen . Wenn Sie {cache_form}Tabelle ginourmous ist, dann wette ich deine {watchdog}und {session}Tabellen sind, auch. Viele andere Module führen Housekeeping-Aktivitäten als Teil ihrer eigenen hook_cron()Funktionen aus.

Möglicherweise möchten Sie auch in der Problemwarteschlange stöbern. Es gab einige Bugs mit denen {cache_form}Sie möglicherweise auf einen gestoßen sind.

mpdonadio
quelle
Ok, ich hatte die crons jetzt richtig eingerichtet, konnte aber trotzdem feststellen, dass sie an einem Tag auf 2 GB angewachsen waren, aber seit einer Woche konstant. Was wird in diesen Tabellen gespeichert?
GoodSp33d
1
{cache_form} hat laufende Formularübermittlungen. {watchdog} hat die Protokolle und {session} hat die Sitzungsinformationen (pro Benutzer).
mpdonadio
6

Daumenregel: Cron sollte regelmäßig für die Verwaltung Ihrer Website ausgeführt werden.

Sie haben in Ihrem Kommentar zu MPD erwähnt, dass Ihre cache_form-Tabelle trotz der Einrichtung und regelmäßigen Ausführung des Cron schnell wächst.

Eine Lösung besteht darin, Ihren Cron häufiger auszuführen. Sagen wir alle sechs Stunden oder weniger? Wenn Sie es sich nicht leisten können, lesen Sie weiter.

Alternative Lösung:

mymodule_cron() {
    cache_clear_all(NULL, 'cache_form');
}

Wenn Sie Elysia Cron installieren , können Sie die Cron-Funktion Ihres Moduls separat ausführen. Sie können die Frequenz des Elysia-Cron beibehalten, damit das Modul alle sechs Stunden ausgeführt wird. Damit Ihr cache_formTisch alle sechs Stunden beschnitten wird.

Während dieses Bereinigungsvorgangs werden die Einträge, die nicht älter als 6 Stunden sind, nicht gelöscht. Wenn alle Einträge gelöscht werden, können sich alle Formulare, die zum Zeitpunkt des Löschens der Einträge gesendet werden, merkwürdig verhalten.

Sehen Sie sich den Code unter https://api.drupal.org/api/drupal/includes!form.inc/function/form_set_cache/7 an

function form_set_cache($form_build_id, $form, $form_state) {
  // 6 hours cache life time for forms should be plenty.
  $expire = 21600;

Wie der Kommentar lautet, gehen sie davon aus, dass es reichlich sein sollte, und in Ihrem Fall wird es zu reichlich für Sie. Der Trick besteht also darin, entweder die cache_form-Tabelle häufiger zu löschen und den Wert von $ expire auf einen niedrigeren Wert zu reduzieren. Wenn Sie die cache_form-Einträge häufiger als den Standardwert von 6 sechs Stunden löschen möchten, müssen Sie die TTL von ändern die cache_form Einträge.

Sie können dies tun, indem Sie cacheboject installieren und dann implementieren, hook_cacheobject_presavein welchem Zeitraum Sie die TTL auf 2 oder 3 Stunden ändern können.

mymodule_cacheobject_presave()($object, $cid, $bin) {
  // Extend the expiry period for prototype forms used in ajax enabled forms.                                                                  
  $cache_ttl = 1 ; // Change it to any number of hours
  if ($bin == 'cache_form') {
    $object->expire = REQUEST_TIME + $cache_ttl * 3600;
  }
}

Ein Nachteil dieses Ansatzes ist, wenn die Formulare nicht innerhalb von 2 Stunden gesendet werden (der von Ihnen festgelegte RTL-Wert), die Formulardaten möglicherweise verloren gehen und einige Probleme mit abgelaufenen Formularen auftreten können.

Gokul NK
quelle
1

Wenn ich auf einer Site, an der ich arbeitete, Leistungsprobleme hatte, stieß ich darauf, nachdem ich das Caching behoben hatte. Sie können den Artikel hier lesen: https://thinktandem.io/blog/2017/11/22/debugging-with-new-relic-blazemeter-strace-more/

In meinem Blog-Beitrag können Sie eine Warteschlange und ein Cron-Setup hinzufügen und dann so etwas wie Elysia Cron verwenden , damit alles gut zusammenarbeitet:

/**
 * Implements hook_cron_queue_info()
 */
function THE MODULE_cron_queue_info() {
  // Set up the worker queue.
  $queues['THE MODULE_queue'] = array(
    'worker callback' => 'THE MODULE_queue_process',
    'time' => 600,
  );
  return $queues;
}

/**
 * Implements hook_cron()
 */
function THE MODULE_cron() {
  // Load up our worker queue.
  $queue = DrupalQueue::get('THE MODULE_queue');

  // Set up the query for expired results.
  $sql = "SELECT cid FROM {cache_form} WHERE expire < :time";
  $query = db_query($sql, array(':time' => REQUEST_TIME));
  $results = $query->fetchAll(PDO::FETCH_ASSOC);

  // Split this into chunks for safety and speed.
  $chunks = array_chunk($results, 5000);
  foreach ($chunks as $chunk) {
    // Add the chunk to the queue worker.
    $queue->createItem($chunk);
  }
}

/**
 * Worker callback defined in hook_cron_queue_info().
 *
 * @param array $data
 *   The array of cids we want to delete.
 */
function THE MODULE_queue_process($data) {
  db_delete('cache_form')
    ->condition('cid', $data, 'IN')
    ->execute();
}
John O.
quelle
1

Verwenden Sie das Modul Safe cache_form Clear .

Damit können Sie den Tisch zuerst auf eine angemessene Größe zuschneiden und dann pflegen.

Auszug aus der Projektseite:

Entfernen Sie sicher eine begrenzte Anzahl von Elementen aus der Tabelle cache_form.

Wenn das Modul installiert ist, bereinigen Sie zuerst cache_form: so lange, drush safe-cache-form-clearbis die Tabellengröße konsistent bleibt. Dies zeigt an , dass Sie alle Datensätze entfernt haben, die älter als 6 Stunden sind.

Es läuft dann auf cron weiter.

Dies ist das Modul , das Acquia für seine Abonnenten zu diesem Zweck dokumentiert . Die Acquia-Dokumentationsseite bietet gute zusätzliche Informationen.

Kay V
quelle