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


11

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

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

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

回答:


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()から呼び出される関数であり、パフォーマンス設定ページの[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モジュールとキャッシュに表示されるメニューリンクを使用して、キャッシュを手動でクリアすることです。

スクリーンショット


私の問題は、2日間だけ運用されているWebサイトのcache_formテーブルのサイズが63Mbであることです。私の恐怖は、このテーブルが制御なしに大きくなることです...
chefnelone

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さまざまなテーブルで安全にお使いいただけます。

また、aを実行するdrush cc allと、キャッシュテーブルも完全に空になることも確信しています。


ありがとう、ただcache_formをクリアする必要があることを確認してください。このテーブルを切り捨てることはできますか?
chefnelone 2012年

4
api.drupal.org/api/drupal/includes%21common.inc/function/…のコードを読むと、cache_formがクリアされないことがわかり、その理由もわかります。あなたがいる場合には正の、これがOKであることを、あなたはこれを行うことができるはずです。cache_formにいくつかの歴史的なバグがあり、エントリーが期限切れにならず、バインドされずに成長しています。
mpdonadio
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.