ฉันจะตัดทอนแคชของตารางทั้งหมดได้ไหม
คุณไม่ควรตัดทอนตาราง "cache_form" เนื่องจากมีข้อมูลที่ใช้จาก Drupal เพื่อตรวจสอบความถูกต้อง หากคุณลบตารางนั้นแบบฟอร์มที่กำลังส่งจากผู้ใช้ในปัจจุบันจะไม่ถูกต้องและผู้ใช้จะต้องส่งแบบฟอร์มอีกครั้ง
อาจมีตารางแคชอื่นที่ทำให้โมดูลทำงานผิดปกติ นั่นคือเหตุผลที่โมดูลที่ใช้ตารางแคชพิเศษ (โดยทั่วไปชื่อขึ้นต้นด้วย "cache_") ควรจะใช้hook_flush_cache ()เพื่อส่งกลับตารางแคชที่สามารถเคลียร์ได้จาก Drupal และจากนั้นจะถูกเรียกด้วยรหัสต่อไปนี้ จาก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()
เป็นฟังก์ชั่นที่เรียกว่าจากsystem_clear_cache_submit ()ตัวจัดการแบบฟอร์มการส่งเรียกว่าเมื่อคุณคลิกที่ปุ่ม "ล้างแคชทั้งหมด" ในหน้าการตั้งค่าประสิทธิภาพ
ระหว่างงาน cron นั้นsystem_cron ()จะล้างแคชโดยใช้รหัสต่อไปนี้
$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);
}
เนื่องจากอาร์กิวเมนต์แรกของcache_clear_all ()คือNULL
รหัสที่ถูกเรียกใช้งานในDrupalDatabaseCache :: clear () (Drupal 7) คือสิ่งต่อไปนี้
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);
}
}
รหัสจะลบเฉพาะแถวที่ไม่ได้ทำเครื่องหมายว่าถาวรและหมดอายุจากตารางที่ส่งคืนจากhook_flush_caches()
และจากตารางแคชต่างๆที่ใช้จาก Drupal รวมถึง "cache_form" ไม่ควรมีแถวมากเกินไปใน "cache_form" หากสิ่งนั้นเกิดขึ้นคุณสามารถลดเวลาที่ส่งผ่านระหว่างการเรียกใช้งาน cron สองครั้งติดต่อกันหรือรันโค้ดต่อไปนี้จากโมดูลที่กำหนดเอง
cache_clear_all(NULL, 'cache_form');
อีกทางเลือกหนึ่งคือการทำให้แคชถูกล้างออกด้วยตนเองโดยใช้โมดูลDevelและลิงก์เมนูที่แสดง