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

11

Я не полностью понимаю действие Очистить кэш. Я просто щелкаю в очистить кеш Очистить все кеши в: admin / config / development / performance, затем иду в базу данных, чтобы проверить все таблицы кеша _... и обнаруживаю, что ни одна из них не пуста.

Это нормально?
Могу ли я просто обрезать все таблицы кеша ...

На самом деле мне просто нужно очистить cache_form. Могу ли я обрезать эту таблицу?

chefnelone
источник

Ответы:

13

Могу ли я просто обрезать все таблицы кеша ...

Вам не следует усекать таблицу «cache_form», так как она содержит данные, используемые Drupal для их проверки; Если вы удалите эту таблицу, форма, отправляемая в данный момент от пользователя, будет признана недействительной, и пользователям потребуется снова отправить форму.

Могут быть и другие кеш-таблицы, которые вызывают странную работу модуля. По этой причине модули, которые используют дополнительные таблицы кеша (имя которых обычно начинается с «cache_»), должны реализовывать hook_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 :: ясно () (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, если у вас правильно настроен cron, эта таблица должна периодически очищаться.
бариста-любитель
2
@kiamlaluno, чтение этого ответа очень информативно и практично, это удобный краткий справочник по шипам, связанным с кэшем. 1+
бариста-любитель
Как вы сказали, я запустил cron, и стол был очищен. Спасибо.
chefnelone
6

Если вы очищаете кеш через пользовательский интерфейс, то, как только страница перезагрузится, кеш снова начнет заполняться. Другими словами, сам процесс обновления этой страницы приводит к тому, что Drupal снова начинает кэшировать (особенно cache_menu).

Вы можете DELETE FROM cacheна разных столах безопасно.

Я также уверен, что выполнение a drush cc allприведет к созданию полностью пустых кеш-таблиц.

mpdonadio
источник
Спасибо, просто чтобы убедиться, что мне просто нужно очистить cache_form. Могу ли я обрезать эту таблицу?
Chefnelone
4
Если вы прочитаете код для api.drupal.org/api/drupal/includes%21common.inc/function/…, вы увидите, что cache_form не очищается и почему. Если вы уверены, что это нормально, тогда вы сможете это сделать. Были некоторые исторические ошибки с cache_form, не истекающие записи и растущие без ограничений.
mpdonadio