ล้างแคชไม่ได้ล้างตารางแคช?


11

ฉันไม่เข้าใจการกระทำ Clear Cache ฉันคลิกที่ล้างแคชล้างแคชทั้งหมดใน: admin / config / development / performance จากนั้นฉันไปที่ฐานข้อมูลเพื่อตรวจสอบตารางแคช _... ทั้งหมดและฉันพบว่าไม่มีรายการใดว่างเปล่า

เป็นเรื่องปกติหรือไม่
ฉันจะตัดทอนแคชของตารางทั้งหมดได้ไหม

อันที่จริงฉันแค่ต้องล้าง cache_form ฉันจะตัดทอนตารางนี้ได้ไหม?

คำตอบ:


13

ฉันจะตัดทอนแคชของตารางทั้งหมดได้ไหม

คุณไม่ควรตัดทอนตาราง "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และลิงก์เมนูที่แสดง

ภาพหน้าจอ


ปัญหาของฉันคือตาราง cache_form มีขนาด 63Mb สำหรับเว็บไซต์ที่ใช้งานได้เพียง 2 วัน ความกลัวของฉันคือตารางนี้จะเติบโตโดยไม่มีการควบคุม ...
chefnelone

1
หากคุณตั้งค่า cron แล้วรายการที่หมดอายุจากแคชทั้งหมด (รวมถึง cache_form) ควรถูกล้างออกทุกครั้งที่เรียกใช้
mpdonadio

1
@chefnelone ตามที่ kiamlaluno อธิบายไว้ถ้าคุณตั้งค่า cron ของคุณอย่างถูกต้องตารางนี้ควรถูกลบเป็นระยะ
บาริสต้าสมัครเล่น

2
@ kiamlaluno การอ่านคำตอบนี้เป็นประโยชน์อย่างมากและเป็นประโยชน์การอ้างอิงด่วนสำหรับหนามที่เกี่ยวข้องกับแคช 1+
บาริสต้าสมัครเล่น

อย่างที่คุณบอกว่าฉันทำงาน cron แล้วและโต๊ะก็หายไป ขอบคุณ
chefnelone

6

หากคุณกำลังล้างแคชผ่าน UI จากนั้นเมื่อโหลดหน้าเว็บอีกครั้งแคชจะเริ่มต้นเติมข้อมูลอีกครั้ง กล่าวอีกนัยหนึ่งการรีเฟรชหน้านั้นทำให้ Drupal เริ่มที่จะแคชสิ่งต่าง ๆ อีกครั้ง (โดยเฉพาะcache_menu)

คุณสามารถDELETE FROM cacheบนโต๊ะต่าง ๆ ได้อย่างปลอดภัย

ฉันค่อนข้างมั่นใจว่าการทำ a drush cc allจะส่งผลให้ตารางแคชว่างเปล่าเช่นกัน


ขอบคุณเพียงเพื่อให้แน่ใจว่าฉันเพียงแค่ต้องล้าง cache_form ฉันจะตัดทอนตารางนี้ได้ไหม?
chefnelone

4
หากคุณอ่านรหัสสำหรับapi.drupal.org/api/drupal/includes%21common.inc/function/…จากนั้นคุณจะเห็นว่า cache_form ไม่ได้รับการล้างและสาเหตุ หากคุณมั่นใจว่าสิ่งนี้ดีแล้วคุณควรทำสิ่งนี้ได้ มีข้อบกพร่องบางอย่างในอดีตที่มี cache_form ไม่หมดอายุรายการและเพิ่มขึ้นโดยไม่ต้องผูก
mpdonadio
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.