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.