Answers:
我可以截断所有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模块及其菜单链接手动清除缓存。
如果您正在通过UI清除缓存,则在页面重新加载后,缓存就会再次开始填充。换句话说,刷新该页面的行为使Drupal重新开始缓存内容(尤其是cache_menu
)。
您可以DELETE FROM cache
安全地在各种桌子上。
我也很确定这样做drush cc all
也会导致完全空的缓存表。