清除缓存不会清除缓存表吗?


11

我不完全了解“清除缓存”操作。我只是单击清除缓存,在admin / config / development / performance中清除所有缓存,然后转到数据库检查所有cache _...表,但我发现它们都不为空。

这正常吗?
我可以截断所有cache _...表吗?

实际上,我只需要清除cache_form。我可以截断这张桌子吗?

Answers:


13

我可以截断所有cache _...表吗?

您不应该截断“ 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 :: 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模块及其菜单链接手动清除缓存。

屏幕截图


我的问题是,对于一个仅生产了2天的网站,cache_form表的大小为63Mb。我担心这张桌子会在
不受控制的

1
如果设置了cron,则每次运行时,应清除所有缓存(包括cache_form)中过期的条目。
mpdonadio

1
@chefnelone正如kiamlaluno所解释的那样,如果您的cron设置正确,则应定期清除此表。
业余咖啡师,2012年

2
@kiamlaluno,阅读此答案非常有益且实用,是与缓存相关的棘手的便捷快速参考。1+
业余咖啡师,2012年

如您所说,我正在运行cron,表已清除。谢谢。
Chefnelone 2012年

6

如果您正在通过UI清除缓存,则在页面重新加载后,缓存就会再次开始填充。换句话说,刷新该页面的行为使Drupal重新开始缓存内容(尤其是cache_menu)。

您可以DELETE FROM cache安全地在各种桌子上。

我也很确定这样做drush cc all也会导致完全空的缓存表。


谢谢,为确保我只需要清除cache_form。我可以截断这张桌子吗?
Chefnelone 2012年

4
如果您阅读api.drupal.org/api/drupal/includes%21common.inc/function/…的代码,则将看到cache_form未被清除以及原因。如果您肯定这是可以的,那么您应该可以这样做。cache_form存在一些历史性错误,它们的条目未过期,并且没有限制地增长。
mpdonadio
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.