Xóa bộ nhớ cache không xóa bảng bộ đệm?


11

Tôi không hoàn toàn hiểu hành động Clear Cache. Tôi chỉ cần nhấp vào xóa bộ nhớ cache Xóa Tất cả bộ nhớ cache trong: admin / config / Development / Performance, sau đó tôi vào cơ sở dữ liệu để kiểm tra tất cả các bảng _... bộ đệm và tôi thấy rằng không có cái nào trong số chúng trống.

Điều này có bình thường không?
Tôi có thể cắt bớt tất cả các bảng _... bộ đệm không?

Trong thực tế, tôi chỉ cần xóa cache_form. Tôi có thể cắt cái bàn này không?

Câu trả lời:


13

Tôi có thể cắt bớt tất cả các bảng _... bộ đệm không?

Bạn không nên cắt bớt bảng "cache_form", vì nó chứa dữ liệu được sử dụng từ Drupal để xác thực chúng; nếu bạn xóa bảng đó, biểu mẫu hiện đang được gửi từ người dùng sẽ bị vô hiệu và người dùng sẽ cần gửi lại biểu mẫu.

Có thể có một số bảng bộ đệm khác khiến mô-đun hoạt động kỳ lạ. Đó là lý do các mô-đun đang sử dụng các bảng bộ đệm bổ sung (có tên thường bắt đầu bằng "cache_") được cho là thực hiện hook_flush_cache () để trả về các bảng bộ đệm có thể bị xóa khỏi Drupal và sau đó được gọi bằng mã sau, từ 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()là hàm được gọi từ system_clear_cache_submit () , trình xử lý biểu mẫu gửi được gọi khi bạn nhấp vào nút "Xóa tất cả bộ nhớ cache", trong trang cài đặt hiệu suất.

Trong các tác vụ cron, system_cron () xóa bộ đệm bằng mã sau.

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

Vì đối số đầu tiên của cache_clear_all ()NULL, mã được thực thi trong DrupalDatabaseCache :: clear () (Drupal 7) là mã sau đây.

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

Mã này chỉ xóa các hàng không được đánh dấu là vĩnh viễn và đã hết hạn, từ các bảng được trả về hook_flush_caches()và từ các bảng bộ đệm khác nhau được sử dụng từ Drupal, bao gồm "cache_form". Không nên có quá nhiều hàng trong "cache_form"; nếu điều đó xảy ra, bạn có thể giảm thời gian trôi qua giữa hai lần thực hiện liên tiếp của các tác vụ cron hoặc thực thi đoạn mã sau từ một mô-đun tùy chỉnh.

cache_clear_all(NULL, 'cache_form');

Một cách khác là làm cho thủ công bị xóa bộ nhớ cache, sử dụng mô-đun Devel và liên kết menu mà nó hiển thị.

ảnh chụp màn hình


vấn đề của tôi là bảng cache_form có kích thước 63Mb cho một trang web đã được sản xuất trong 2 ngày. Nỗi sợ hãi của tôi là chiếc bàn này sẽ phát triển mà không có sự kiểm soát ...
Chefnelone

1
Nếu bạn đã thiết lập cron, thì các mục đã hết hạn từ tất cả các bộ đệm (bao gồm cả cache_form) sẽ bị xóa mỗi khi nó chạy.
mpdon Arena

1
@chefnelone Như kiamlaluno đã giải thích, nếu bạn đã thiết lập cron đúng cách, bảng này sẽ được xóa theo định kỳ.
barista nghiệp dư

2
@kiamlaluno, đọc câu trả lời này rất nhiều thông tin và thực tế, một tài liệu tham khảo nhanh tiện dụng cho những cái gai liên quan đến bộ đệm. 1+
barista nghiệp dư

Như bạn nói tôi nhận được cron chạy và bảng đã bị xóa. Cảm ơn.
Chefnelone

6

Nếu bạn đang xóa bộ nhớ cache thông qua giao diện người dùng, thì ngay sau khi trang tải lại, thì bộ đệm sẽ bắt đầu lấp đầy trở lại. Nói cách khác, hành động làm mới trang đó khiến Drupal bắt đầu lưu lại mọi thứ (đặc biệt cache_menu).

Bạn có thể DELETE FROM cachetrên các bảng khác nhau một cách an toàn.

Tôi cũng khá chắc chắn rằng việc thực hiện drush cc allsẽ dẫn đến các bảng bộ đệm hoàn toàn trống, quá.


Cảm ơn, chỉ để chắc chắn rằng tôi chỉ cần xóa cache_form. Tôi có thể cắt cái bàn này không?
Chefnelone

4
Nếu bạn đọc mã cho api.drupal.org/api/drupal/includes%21common.inc/feft/ trộm thì bạn sẽ thấy cache_form không bị xóa và tại sao. Nếu bạn tích cực rằng điều này là ổn, thì bạn sẽ có thể làm điều này. Đã có một số lỗi lịch sử với cache_form không hết hạn các mục và ngày càng bị ràng buộc.
mpdon Arena
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.