Kích thước bảng Cache Form là rất lớn


13

Kích thước của bảng bộ đệm đã tăng lên hơn 10 GB vào tháng trước và tôi đã khắc phục tạm thời bằng cách cắt bớt nó. Lần trước tôi đã kiểm tra nó là khoảng 1GB. Vì vậy, trong vài tháng nữa, nó sẽ đạt 10GB một lần nữa. Làm thế nào điều này nên được xử lý?

Lưu ý rằng tôi đã vô hiệu hóa tất cả các công việc định kỳ trên trang web này. Nếu đây là lý do, cron nên được kích hoạt?

Câu trả lời:


24

Các {cache_form}bảng là một chút hài hước, và cư xử một cách hơi khác so với bảng bộ nhớ cache khác.

Nếu bạn nhìn vào drupal_flush_all_caches()bạn sẽ thấy điều đó {cache_form}không bị xóa. Điều này là để bảo vệ các hình thức đang tiến hành khỏi bị cấm.

Các system_cron()chức năng không nâng niu mang về cắt tỉa ra dữ liệu cũ từ {cache_form}cùng với các bảng bộ nhớ cache khác.

Bạn thực sự nên chạy cron trên tất cả các trang web Drupal. Nếu bạn {cache_form}bảng là ginourmous, sau đó tôi đặt cược của bạn {watchdog}{session}bàn là, quá. Nhiều mô-đun khác chạy hoạt động vệ sinh như là một phần của hook_cron()chức năng riêng của họ .

Bạn cũng có thể muốn chọc xung quanh hàng đợi vấn đề. Đã có một số lỗi với {cache_form}, và bạn có thể đang chạy vào một.


Ok tôi đã thiết lập các con dơi đúng cách, nhưng tôi vẫn có thể thấy rằng nó đã tăng lên 2 GB trong một ngày, nhưng nó không đổi kể từ một tuần. Điều gì sẽ được lưu trữ trong các bảng này?
GoodSp33d

1
{cache_form} có các lần gửi biểu mẫu đang thực hiện. {watchdog} có nhật ký và {session} có thông tin phiên (trạng thái trên mỗi người dùng).
mpdon Arena

6

Quy tắc ngón tay cái: Cron nên được chạy thường xuyên để quản lý trang web của bạn.

Bạn đã đề cập trong nhận xét của mình với MPD rằng mặc dù thiết lập cron và chạy chúng thường xuyên, bảng cache_form của bạn sẽ tăng lên nhanh chóng.

Một giải pháp cho điều đó là chạy cron của bạn thường xuyên hơn. Nói cứ sau sáu giờ hoặc ít hơn? Nếu bạn không đủ khả năng để làm điều đó đọc thêm.

Giải pháp thay thế:

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

Cài đặt Elysia Cron và bây giờ bạn có thể chạy chức năng cron của mô-đun riêng. Bạn có thể giữ tần số của cron Elysia cho mô-đun của bạn để chạy cứ sau sáu giờ. Vì vậy, cache_formbàn của bạn được cắt tỉa cứ sau sáu giờ.

Trong quá trình cắt tỉa này, các mục không quá 6 giờ sẽ không bị xóa. Lý do là, nếu tất cả các mục bị xóa thì bất kỳ biểu mẫu nào đang được gửi tại thời điểm xóa các mục có thể hành xử kỳ lạ.

Nhìn vào mã trong https://api.drupal.org/api/drupal/includes!form.inc/feft/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;

Khi bình luận đọc, họ cho rằng nó sẽ rất nhiều và trong trường hợp của bạn, nó đang trở nên quá nhiều đối với bạn. Vì vậy, mẹo là xóa bảng cache_form thường xuyên hơn và giảm giá trị $ hết hạn xuống giá trị thấp hơn, nếu bạn muốn xóa các mục cache_form thường xuyên hơn giá trị mặc định là 6 sáu giờ thì bạn cần thay đổi TTL các mục cache_form.

Bạn có thể làm điều đó bằng cách cài đặt bộ đệm ẩn và sau đó thực hiện hook_cacheobject_presavetrong đó bạn có thể thay đổi TTL thành 2 hoặc 3 giờ.

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

Một nhược điểm của phương pháp này là nếu các biểu mẫu không được gửi trong vòng 2 giờ (giá trị RTL bạn đặt) thì dữ liệu biểu mẫu có thể bị mất và bạn có thể gặp một số vấn đề về biểu mẫu đã hết hạn.



1

Khi tôi gặp vấn đề về hiệu suất trên một trang web tôi đang làm việc, tôi đã gặp phải vấn đề này sau khi tôi sửa bộ nhớ đệm. Bạn có thể đọc bài viết tại đây: https://thinktandem.io/blog/2017/11/22/debugging-with-new-relic-blazemeter-strace-more/

Từ bài đăng trên blog của tôi, bạn có thể thêm thiết lập hàng đợi và cron, sau đó sử dụng một cái gì đó như Elysia Cron để làm cho tất cả hoạt động tốt với nhau:

/**
 * 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

Sử dụng mô-đun Xóa bộ nhớ cache an toàn .

Nó sẽ cho phép bạn cắt tỉa bàn với kích thước hợp lý trước, sau đó duy trì nó.

Tóm tắt từ trang dự án:

Xóa an toàn một số mục giới hạn khỏi bảng cache_form.

Sau khi mô-đun được cài đặt, trước tiên, prune cache_form: chạy drush safe-cache-form-clearcho đến khi kích thước bảng không đổi, cho biết bạn đã xóa tất cả các bản ghi cũ hơn 6 giờ.

Sau đó nó sẽ tiếp tục chạy trên cron.

Đây là mô-đun được ghi nhận cho mục đích này bởi Acquia cho các thuê bao của họ. Trang tài liệu Acquia cung cấp thông tin bổ sung tốt.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.