回答:
すべての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()から呼び出される関数であり、パフォーマンス設定ページの[Clear all caches]ボタンをクリックしたときに呼び出される送信フォームハンドラーです。
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()
、および「cache_form」を含むDrupalから使用されたさまざまなキャッシュテーブルから、永続的としてマークされておらず、期限切れの行のみを削除します。「cache_form」には行が多すぎてはいけません。これが発生した場合、cronタスクの2つの連続した実行の間に経過する時間を短縮するか、カスタムモジュールから次のコードを実行できます。
cache_clear_all(NULL, 'cache_form');
もう1つの方法は、Develモジュールとキャッシュに表示されるメニューリンクを使用して、キャッシュを手動でクリアすることです。
UIを介してキャッシュをクリアしている場合は、ページがリロードされるとすぐに、キャッシュが再びいっぱいになります。つまり、そのページを更新すると、Drupalは再びキャッシュを開始します(特にcache_menu
)。
DELETE FROM cache
さまざまなテーブルで安全にお使いいただけます。
また、aを実行するdrush cc all
と、キャッシュテーブルも完全に空になることも確信しています。