ขนาดตารางฟอร์มแคชเป็นอย่างมาก


13

ขนาดของตารางแคชเพิ่มขึ้นเป็น 10+ GB เมื่อเดือนที่แล้วและฉันได้แก้ไขชั่วคราวโดยตัดทอน ครั้งล่าสุดที่ฉันตรวจสอบมันประมาณ 1GB ดังนั้นในอีกไม่กี่เดือนข้างหน้าก็จะถึง 10GB อีกครั้ง ควรจัดการกับสิ่งนี้อย่างไร?

โปรดทราบว่าฉันได้ปิดการใช้งาน cron ทั้งหมดในเว็บไซต์นี้ หากนี่คือเหตุผลคุณควรเปิดใช้ cron ใด

คำตอบ:


24

{cache_form}ตารางเป็นเพียงเล็กน้อยที่ตลกและพฤติกรรมในลักษณะที่แตกต่างกันเล็กน้อยกว่าตารางแคชอื่น ๆ

หากคุณดูที่drupal_flush_all_caches()คุณจะเห็นว่า{cache_form}ยังไม่ได้ล้าง นี่คือการป้องกันฟอร์มที่กำลังดำเนินอยู่จากการถูกอบ

system_cron()ฟังก์ชั่นไม่ดูแลตัดแต่งกิ่งออกจากข้อมูลเก่า{cache_form}พร้อมกับตารางแคชอื่น ๆ

คุณควรใช้cronในทุกเว็บไซต์ของ Drupal หากคุณ{cache_form}ตาราง ginourmous แล้วฉันเดิมพันของคุณ{watchdog}และ{session}ตารางเกินไป โมดูลอื่น ๆ อีกมากมายใช้กิจกรรมดูแลทำความสะอาดเป็นส่วนหนึ่งของhook_cron()ฟังก์ชั่นของตัวเอง

คุณอาจต้องการแหย่แถวคิวปัญหา มีข้อบกพร่องบางอย่างกับ{cache_form}และคุณอาจจะทำงานเป็นหนึ่ง


โอเคฉันได้ตั้งค่า crons อย่างถูกต้องแล้ว แต่ฉันก็ยังเห็นได้ว่ามันเพิ่มเป็น 2 GB ในหนึ่งวัน แต่มันคงที่มาตั้งแต่หนึ่งสัปดาห์ สิ่งที่จะถูกเก็บไว้ในตารางเหล่านี้?
GoodSp33d

1
{cache_form} มีการส่งแบบฟอร์มที่อยู่ระหว่างดำเนินการ {watchdog} มีบันทึกและ {session} มีข้อมูลเซสชัน (สถานะต่อผู้ใช้)
mpdonadio

6

กฎ Thumb: Cron ควรทำงานเป็นประจำเพื่อทำความสะอาดเว็บไซต์ของคุณ

คุณพูดถึงความคิดเห็นของคุณต่อ MPD ว่าแม้จะมีการตั้งค่า cron และเรียกใช้พวกเขาเป็นประจำตาราง cache_form ของคุณเติบโตอย่างรวดเร็ว

ทางออกหนึ่งที่ใช้ cron ของคุณบ่อยขึ้น พูดทุกหกชั่วโมงหรือน้อยกว่า หากคุณไม่สามารถที่จะทำอ่านเพิ่มเติม

ทางเลือกอื่น:

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

ติดตั้งElysia Cronและตอนนี้คุณสามารถเรียกใช้ฟังก์ชัน cron ของโมดูลของคุณแยกกัน คุณสามารถรักษาความถี่ของ Elysia cron เพื่อให้โมดูลของคุณทำงานได้ทุก ๆ หกชั่วโมง เพื่อให้cache_formโต๊ะของคุณถูกตัดทุกๆหกชั่วโมง

ในระหว่างกระบวนการตัดแต่งกิ่งรายการที่มีอายุมากกว่า 6 ชั่วโมงจะไม่ถูกลบ เหตุผลถ้าหากรายการทั้งหมดจะถูกลบแล้วรูปแบบใด ๆ ที่ถูกส่งในช่วงเวลาของการลบรายการที่สามารถมีพฤติกรรมแปลก ๆ

ดูรหัสใน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;

ในขณะที่ความคิดเห็นอ่านพวกเขากำลังสมมติว่ามันควรจะมากและในกรณีของคุณมันจะกลายเป็นมากเกินไปสำหรับคุณ ดังนั้นเคล็ดลับคือการล้างตาราง cache_form บ่อยขึ้นและลดค่าของ $ expire ให้เป็นค่าที่ต่ำกว่าหากคุณต้องการล้างรายการ cache_form บ่อยกว่าค่าเริ่มต้น 6 6 ชั่วโมงคุณต้องเปลี่ยน TTL ของ รายการ cache_form

คุณสามารถทำได้โดยการติดตั้งcachebojectจากนั้นดำเนินการhook_cacheobject_presaveภายในซึ่งคุณสามารถเปลี่ยน TTL เป็น 2 หรือ 3 ชั่วโมง

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

ข้อเสียประการหนึ่งของวิธีการนี้คือหากไม่ได้ส่งแบบฟอร์มภายใน 2 ชั่วโมง (ค่า RTL ที่คุณกำหนด) ข้อมูลในแบบฟอร์มอาจสูญหายได้และคุณอาจได้รับปัญหาบางอย่างที่หมดอายุ



1

เมื่อฉันมีปัญหาด้านประสิทธิภาพในไซต์ที่ฉันทำงานอยู่ฉันพบปัญหานี้หลังจากที่ฉันแคชแล้ว คุณสามารถอ่านบทความได้ที่นี่: https://thinktandem.io/blog/2017/11/22/debugging-with-new-relic-blazemeter-strace-more/

จากการโพสต์บล็อกของฉันคุณสามารถเพิ่มการตั้งค่าคิวและ cron แล้วใช้สิ่งที่คล้ายElysia Cronเพื่อให้การทำงานร่วมกันเป็นไปด้วยดี:

/**
 * 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();
}

1

ใช้โมดูลSafe cache_form Clear

มันจะช่วยให้คุณตัดตารางเป็นขนาดที่เหมาะสมก่อนจากนั้นรักษามัน

ข้อมูลสรุปที่ตัดตอนมาจากหน้าโครงการ:

ลบรายการในจำนวนที่ จำกัด ออกจากตาราง cache_form อย่างปลอดภัย

เมื่อโมดูลได้รับการติดตั้งแล้วให้ตัดลูกพรุน cache_form ก่อน: เรียกใช้drush safe-cache-form-clearจนกว่าขนาดของตารางจะคงที่โดยระบุว่าคุณได้ลบระเบียนทั้งหมดที่เก่ากว่า 6 ชั่วโมงแล้ว

จากนั้นจะทำงานบน cron ต่อไป

นี่คือโมดูลที่บันทึกไว้สำหรับวัตถุประสงค์นี้โดย Acquiaสำหรับสมาชิกของพวกเขา หน้าเอกสารของ Acquia ให้ข้อมูลเพิ่มเติมที่ดี

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.