Clear Cacheアクションを完全に理解していません。キャッシュをクリアするClear All caches in:admin/config/development/performanceをクリックするだけで、データベースに移動してすべてのcache _...テーブルをチェックしましたが、どれも空ではありません。
これは正常ですか?
すべてのcache _...テーブルを切り捨てることはできますか?
実際、私はcache_formをクリアする必要があるだけです。このテーブルを切り捨てることはできますか?
すべてのcache _...テーブルを切り捨てることはできますか?
Drupalから検証するために使用されたデータが含まれているため、「cache_form」テーブルを切り捨てないでください。そのテーブルを削除すると、現在ユーザーから送信されているフォームが無効になります。ユーザーはフォームを再度送信する必要があります。
モジュールが奇妙に動作する原因となる他のいくつかのキャッシュテーブルが存在する可能性があります。これが、追加のキャッシュテーブル(名前は通常「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()
から返されたテーブル、および「cache_form」を含むDrupalから使用されているさまざまなキャッシュテーブルから、永続的としてマークされておらず、期限切れの行のみを削除します。 「cache_form」には行が多すぎてはいけません。これが発生した場合、cronタスクの2つの連続した実行の間に経過する時間を短縮するか、カスタムモジュールから次のコードを実行できます。
_cache_clear_all(NULL, 'cache_form');
_
別の方法として、 Devel モジュールとそれが表示するメニューリンクを使用して、手動でキャッシュをクリアします。
UIを介してキャッシュをクリアしている場合は、ページがリロードされるとすぐに、キャッシュが再びいっぱいになります。つまり、そのページを更新すると、Drupalがキャッシュを再開し始めます(特にcache_menu
)。
あなたはできる DELETE FROM cache
さまざまなテーブルで安全に。
また、drush cc all
も完全に空のキャッシュテーブルになります。