web-dev-qa-db-ja.com

キャッシュをクリアしてもキャッシュテーブルはクリアされませんか?

Clear Cacheアクションを完全に理解していません。キャッシュをクリアするClear All caches in:admin/config/development/performanceをクリックするだけで、データベースに移動してすべてのcache _...テーブルをチェックしましたが、どれも空ではありません。

これは正常ですか?
すべてのcache _...テーブルを切り捨てることはできますか?

実際、私はcache_formをクリアする必要があるだけです。このテーブルを切り捨てることはできますか?

11
chefnelone

すべての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 モジュールとそれが表示するメニューリンクを使用して、手動でキャッシュをクリアします。

screenshot

13
kiamlaluno

UIを介してキャッシュをクリアしている場合は、ページがリロードされるとすぐに、キャッシュが再びいっぱいになります。つまり、そのページを更新すると、Drupalがキャッシュを再開し始めます(特にcache_menu)。

あなたはできる DELETE FROM cacheさまざまなテーブルで安全に。

また、drush cc allも完全に空のキャッシュテーブルになります。

6
mpdonadio