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 () là 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ị.