Hapus cache tidak menghapus tabel cache?

11

Saya tidak sepenuhnya memahami tindakan Clear Cache. Saya cukup mengeklik cache yang jelas Bersihkan Semua cache di: admin / config / development / performance, kemudian saya pergi ke database untuk memeriksa semua cache _... tabel dan saya menemukan bahwa tidak ada satupun yang kosong.

Apakah ini normal?
Bisakah saya memangkas semua tabel cache _...?

Sebenarnya saya hanya perlu menghapus cache_form. Bisakah saya memotong tabel ini?

chefnelone
sumber

Jawaban:

13

Bisakah saya memangkas semua tabel cache _...?

Anda tidak boleh memotong tabel "cache_form", karena berisi data yang digunakan dari Drupal untuk memvalidasinya; jika Anda menghapus tabel itu, formulir yang sedang dikirim dari pengguna akan tidak valid, dan pengguna harus mengirimkan formulir lagi.

Mungkin ada beberapa tabel cache lain yang menyebabkan modul bertindak aneh. Itulah alasan modul yang menggunakan tabel cache tambahan (yang namanya biasanya dimulai dengan "cache_") seharusnya menerapkan hook_flush_cache () untuk mengembalikan tabel cache yang dapat dihapus dari Drupal, dan yang kemudian dipanggil dengan kode berikut, dari 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()adalah fungsi yang dipanggil dari system_clear_cache_submit () , penangan formulir pengiriman dipanggil ketika Anda mengklik tombol "Hapus semua cache", di halaman pengaturan kinerja.

Selama tugas cron, system_cron () membersihkan cache menggunakan kode berikut.

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

Karena argumen pertama dari cache_clear_all () adalah NULL, kode yang dieksekusi di DrupalDatabaseCache :: clear () (Drupal 7) adalah yang berikut.

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

Kode hanya menghapus baris, yang tidak ditandai sebagai permanen, dan kedaluwarsa, dari tabel yang dikembalikan dari hook_flush_caches(), dan dari berbagai tabel cache yang digunakan dari Drupal, termasuk "cache_form." Seharusnya tidak ada terlalu banyak baris di "cache_form"; jika itu terjadi, Anda dapat mengurangi waktu yang berlalu antara dua eksekusi berturut-turut tugas cron, atau mengeksekusi kode berikut dari modul khusus.

cache_clear_all(NULL, 'cache_form');

Alternatifnya adalah dengan secara manual menyebabkan cache dihapus, menggunakan modul Devel , dan tautan menu yang ditampilkan.

tangkapan layar

kiamlaluno
sumber
masalah saya adalah bahwa tabel cache_form memiliki ukuran 63Mb untuk situs web yang telah di produksi selama 2 hari saja. Ketakutan saya adalah bahwa tabel ini akan tumbuh tanpa kendali ...
chefnelone
1
Jika Anda memiliki pengaturan cron, maka entri yang sudah kadaluwarsa dari semua cache (termasuk cache_form) harus dihapus setiap kali berjalan.
mpdonadio
1
@ chefnelone Seperti yang dijelaskan kiamlaluno, jika Anda mengatur cron dengan benar, tabel ini harus dibersihkan secara berkala.
amatir barista
2
@kiamlaluno, membaca jawaban ini sangat informatif dan praktis, referensi cepat yang berguna untuk duri terkait cache. 1+
barista amatir
Seperti yang Anda katakan saya menjalankan cron dan meja dibersihkan. Terima kasih.
chefnelone
6

Jika Anda mengosongkan cache melalui UI, maka segera setelah halaman dimuat ulang, maka cache akan mulai terisi lagi. Dengan kata lain, tindakan menyegarkan halaman itu menyebabkan Drupal mulai men-cache hal-hal lagi (terutama cache_menu).

Anda bisa DELETE FROM cachedi berbagai tabel dengan aman.

Saya juga cukup yakin bahwa melakukan drush cc allakan menghasilkan tabel cache yang kosong juga.

mpdonadio
sumber
Terima kasih, hanya untuk memastikan saya hanya perlu menghapus cache_form. Bisakah saya memotong tabel ini?
chefnelone
4
Jika Anda membaca kode untuk api.drupal.org/api/drupal/includes%21common.inc/function/… maka Anda akan melihat bahwa cache_form tidak dihapus dan mengapa. Jika Anda yakin ini OK, maka Anda harus dapat melakukan ini. Ada beberapa bug bersejarah dengan cache_form tidak kadaluarsa entri, dan semakin besar tanpa batas.
mpdonadio