Очистити кеш не очищає таблиці кеша?


11

Я не повністю розумію дії Clear Cache. Я просто натискаю очистити кеш Очистити всі кеші в: admin / config / development / performance, потім переходжу до бази даних, щоб перевірити всі таблиці кешу _..., і я виявив, що жодна з них не порожня.

Це нормально?
Чи можу я просто усікати всі таблиці кешу _...?

Насправді мені просто потрібно очистити cache_form. Чи можна усікати цю таблицю?

Відповіді:


13

Чи можу я просто усікати всі таблиці кешу _...?

Не слід усікати таблицю "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 та посилання на меню, яке воно відображає.

скріншот


моя проблема полягає в тому, що таблиця cache_form має розмір 63 Мб для веб-сайту, який виробляється ДОВІДНО 2 дні. Я побоююся, що ця таблиця буде рости без контролю ...
chefnelone

1
Якщо у вас встановлено cron, то запису з минулим терміном з усіх кешів (включаючи cache_form) слід очищати кожного разу, коли він запускається.
mpdonadio

1
@chefnelone Як пояснив kiamlaluno, якщо ваш крон правильно налаштований, цю таблицю слід періодично очищати.
аматорська бариста

2
@kiamlaluno, прочитавши цю відповідь дуже інформативно та практично, це зручна швидка довідка для шипів, пов’язаних з кешем. 1+
любительська бариста

Як ви сказали, я запускаю cron і стіл очищається. Дякую.
chefnelone

6

Якщо ви очищаєте кеш через інтерфейс користувача, то, як тільки сторінка перезавантажується, кеш знову почне заповнюватися. Іншими словами, акт оновлення цієї сторінки змушує Drupal знову почати кешувати речі (особливо cache_menu).

Можна DELETE FROM cacheна різних столах безпечно.

Я також впевнений, що виконання drush cc allцього результату також призведе до повністю порожніх таблиць кешу.


Дякую, просто щоб бути впевненим, мені просто потрібно очистити cache_form. Чи можна усікати цю таблицю?
chefnelone

4
Якщо ви прочитаєте код для api.drupal.org/api/drupal/includes%21common.inc/function/…, ви побачите, що cache_form не очищається і чому. Якщо ви впевнені, що це все в порядку, тоді ви повинні зробити це. Були деякі історичні помилки, у яких cache_form не закінчується, і зростає без обмежень.
mpdonadio
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.