web-dev-qa-db-ja.com

Drupal Cronはページキャッシュにどのように影響しますか?

Drupalのcronがサイトのページキャッシュにどのように影響するかを理解しようとしています。リクエストが行われたときにページキャッシュからサービスが提供されるように、できるだけ多くのページをキャッシュテーブルに保存すると便利です。

しかし、Drupalのcronジョブがキャッシュに及ぼす影響について、相反する答えを得ています!

このリンクは、「各cron実行がすべてのページのキャッシュをクリアする」と述べています。

http://tomroelandts.com/articles/how-to-ensure-that-visitors-always-see-cached-pages-in-drupal-7

同様に-> drupal.org/node/1576686

しかし、この男は、期限切れの可能性があるキャッシュのみをクリアすると言います:

https://www.drupal.org/node/1691116#comment-6352756

これについて決定的な答えを得たいと思います!

5
Nick Dynan

システムモジュールのsystem_cron()は、キャッシュテーブルからexpirableエントリをクリアします。期限切れのキャッシュエントリは、「期限切れ可能」日を過ぎているか、最初にCACHE_TEMPORARYフラグを使用して保存されたエントリです。

デフォルトのデータベースキャッシュを使用している場合、キャッシュテーブルを調べることで、どのエントリが期限切れになるかを確認できます。 「expire」列には、エントリが期限切れになるタイムスタンプが含まれています。値が「-1」の場合、CACHE_TEMPORARYであり、常に期限切れになります。

Drupalのデフォルトのデータベースページキャッシュに関する限り、最小のキャッシュライフタイムは有効期限の値に適用されないため、「有効期限」列からはあまりわかりません。代わりに、Drupalはキャッシュ全体が最後にフラッシュされた時間を追跡し、少なくとも「最小キャッシュライフタイム」秒が経過するまでページキャッシュを再度フラッシュしません。

6
Les Lim

最小キャッシュ有効期間がデフォルトのnoneに設定されている場合、ページキャッシュは毎回cronでクリアされます。最小キャッシュライフタイムが設定されている場合、cronは最小キャッシュライフタイム設定ごとに1回だけすべてのキャッシュエントリを削除します。

drupal_page_set_cache() の中に'expire' => CACHE_TEMPORARY,

コアデータベースキャッシュでは、クリア時の最小キャッシュライフタイムは無視されます。 DrupalDatabaseCache :: clear ;のコードを見ると、キャッシュが作成されたときに関係するコードはありません。したがって、最小キャッシュ存続時間は強制されません。内部 system_cron クリアされるキャッシュの1つはcache_pageです。

これを変更したい場合は、system_cronの実行頻度を変更できます。 elysia cron はこれを行う良い方法です。ただし、GUIからノードを保存すると、ページキャッシュもクリアされることに注意してください。 node_form_submit を参照してください。下部で、ページキャッシュがクリアされます。保存されたコメントについても同様です。 comment_form_submit() を参照してください。

最善の解決策は、ページキャッシュの動作を変更することです。最小のキャッシュ有効期間を尊重するようにしてください。これを強制する2つのモジュールがあります。
https://www.drupal.org/project/apdqc 非同期プリフェッチデータベースクエリキャッシュ
https://www.drupal.org/project/adbc 代替データベースキャッシュ
ADBCは、最小キャッシュライフタイムをより使いやすく、データベースに依存しないようにするために作成されました。 APDQCにはADBCのすべてが含まれていますが、MySQLを使用しているときのデッドロックとメタデータロックの問題が取り除かれ、キャッシュの取得と設定の呼び出しが高速化されます。 MySQLでのみ機能します。 MySQLを使用している場合、APDQCの使用をお勧めします。別のデータベースを使用している場合は、ADBCが適しています。

最小値が適用されると、実際に更新された場合に、キャッシュされたページを更新する方法が必要になります。 Cache Expiration モジュールがこれを行います。

D7の問題: https://www.drupal.org/node/8916

5
mikeytown2