Чи можу я просто усікати всі таблиці кешу _...?
Не слід усікати таблицю "cache_form", оскільки вона містить дані, які використовуються з Drupal для їх перевірки; якщо ви видалите цю таблицю, форма, яка наразі надсилається користувачеві, буде визнана недійсною, і користувачам потрібно буде знову надіслати форму
Можуть бути інші таблиці кешу, які змушують модуль діяти дивно. Ось чому модулі, які використовують додаткові таблиці кешу (назва яких, як правило, починається з "кеш_"), повинні реалізувати гак_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 та посилання на меню, яке воно відображає.