Могу ли я просто обрезать все таблицы кеша ...
Вам не следует усекать таблицу «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 и ссылки меню, которую он показывает.