Ukuran tabel Cache Form sangat besar

13

Ukuran tabel cache telah meningkat menjadi 10+ GB bulan lalu, dan saya telah memperbaikinya sementara dengan memotongnya. Terakhir kali saya memeriksanya sekitar 1GB. Jadi dalam beberapa bulan akan mencapai 10GB lagi. Bagaimana ini harus ditangani?

Perhatikan bahwa saya telah menonaktifkan semua pekerjaan cron di situs ini. Jika ini alasannya, cron mana yang harus diaktifkan?

GoodSp33d
sumber

Jawaban:

24

The {cache_form}meja adalah sedikit lucu, dan berperilaku dalam cara yang sedikit berbeda dari tabel cache yang lainnya.

Jika Anda melihat drupal_flush_all_caches()Anda akan melihat bahwa {cache_form}itu tidak dihapus. Hal ini untuk melindungi formulir yang sedang diproses agar tidak nuked.

The system_cron()Fungsi tidak mengurus pemangkasan keluar data lama dari {cache_form}bersama dengan tabel cache yang lainnya.

Anda harus menjalankan cron di semua situs Drupal. Jika Anda {cache_form}tabel ginourmous, maka saya yakin Anda {watchdog}dan {session}tabel, juga. Banyak modul lain menjalankan aktivitas tata graha sebagai bagian dari milik merekahook_cron() fungsinya .

Anda mungkin juga ingin melihat-lihat antrian masalah. Ada beberapa bug dengan {cache_form}, dan Anda mungkin mengalami satu.

mpdonadio
sumber
Ok saya telah mengatur crons dengan benar sekarang, tetapi saya masih bisa melihat bahwa ia tumbuh 2 GB dalam satu hari, tetapi sudah konstan sejak satu minggu. Apa yang akan disimpan dalam tabel ini?
GoodSp33d
1
{cache_form} memiliki pengiriman formulir dalam proses. {watchdog} memiliki log, dan {session} memiliki informasi sesi (status per-pengguna).
mpdonadio
6

Aturan Jempol: Cron harus dijalankan secara teratur untuk pemeliharaan situs web Anda.

Anda menyebutkan dalam komentar Anda untuk MPD bahwa meskipun mengatur cron dan menjalankannya secara teratur tabel cache_form Anda tumbuh dengan cepat.

Salah satu solusi untuk itu adalah menjalankan cron Anda lebih sering. Katakan setiap enam jam atau kurang? Jika Anda tidak mampu melakukannya bacalah lebih lanjut.

Solusi Alternatif:

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

Instal Elysia Cron dan sekarang Anda dapat menjalankan fungsi cron modul Anda secara terpisah. Anda dapat menjaga frekuensi cron Elysia agar modul Anda berjalan setiap enam jam. Sehingga cache_formmeja Anda dipangkas setiap enam jam.

Selama proses pemangkasan ini, entri yang tidak lebih dari 6 jam tidak akan dihapus. Alasannya, jika semua entri dihapus maka segala bentuk yang diajukan pada saat menghapus entri dapat berperilaku aneh.

Lihatlah kode di https://api.drupal.org/api/drupal/includes!form.inc/function/form_set_cache/7

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

Ketika komentar itu berbunyi, mereka menganggap itu harus banyak dan dalam kasus Anda itu menjadi terlalu banyak untuk Anda. Jadi triknya adalah menghapus tabel cache_form lebih sering dan mengurangi nilai $ expire ke nilai yang lebih rendah, jika Anda ingin menghapus entri cache_form lebih sering daripada nilai default 6 enam jam maka Anda perlu mengubah TTL dari entri cache_form.

Anda dapat melakukannya dengan menginstal cacheboject dan kemudian mengimplementasikan hook_cacheobject_presavedi dalamnya Anda dapat mengubah TTL menjadi 2 atau 3 jam.

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;
  }
}

Satu kelemahan dari pendekatan ini adalah jika formulir tidak dikirimkan dalam waktu 2 jam (nilai RTL yang Anda tetapkan) data formulir dapat hilang dan Anda mungkin mendapatkan beberapa formulir yang kedaluwarsa.

Gokul NK
sumber
1

Ketika saya mengalami masalah kinerja di situs tempat saya bekerja, saya mengalami hal ini setelah memperbaiki caching. Anda dapat membaca artikel di sini: https://thinktandem.io/blog/2017/11/22/debugging-with-new-relic-blazemeter-strace-more/

Dari posting blog saya, Anda dapat menambahkan antrian dan pengaturan cron, kemudian gunakan sesuatu seperti Elysia Cron untuk membuat semuanya bekerja bersama dengan baik:

/**
 * 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
sumber
1

Gunakan modul Safe cache_form Clear .

Ini akan memungkinkan Anda memangkas tabel ke ukuran yang wajar terlebih dahulu, lalu pertahankan.

Ringkasan kutipan dari halaman proyek:

Menghapus sejumlah item dengan aman dari tabel cache_form.

Setelah modul terinstal, prune pertama cache_form: jalankan drush safe-cache-form-clearhingga ukuran tabel tetap konsisten, menunjukkan Anda telah menghapus semua catatan yang lebih lama dari 6 jam.

Kemudian akan terus berjalan di cron.

Ini adalah modul yang didokumentasikan untuk tujuan ini oleh Acquia untuk pelanggan mereka. Halaman dokumentasi Acquia menyediakan informasi tambahan yang bagus.

Kay V
sumber