キャッシュmax-age
Cache max-age = 時間ベースの依存関係
Cache max-ageは、Cache-ControlヘッダーのHTTP max-ageディレクティブに類似しています。
なぜ?
キャッシュのmax-ageは、時間に依存するキャッシュを作成するための宣言的な方法を提供します。
一部のデータは限られた期間のみ有効であり、その場合は適切なmax-ageを指定する必要があります。ただし、Drupal 8コアの場合、限られた期間のみ有効なデータはありません。通常は永続的にキャッシュし(下記参照)、無効化のためにキャッシュタグに完全に依存しています。
どのような値か?
キャッシュのmax-ageは、秒数を表す正の整数です。
キャッシュのmax-ageは個々の整数として渡されます。特定のキャッシュアイテムは論理的に1つのmax-ageしか持つことができないためです。
例:
- 60は60秒間キャッシュすることを意味します
- 100は100秒間キャッシュすることを意味します
- 0は0秒間キャッシュすることを意味します。つまり、キャッシュされません
- \Drupal\Core\Cache\Cache::PERMANENTは、永久にキャッシュすることを意味します。つまり、キャッシュタグによってのみ無効化されます。(言い換えれば:∞、つまり無限の秒数。)
したがって、たとえばレンダリングされたブロックのキャッシュを防止したい場合は、そのブロックにmax-age = 0を指定する必要があります。
レンダー配列の例:
$build['#cache']['max-age'] = 0;
関数での例:
\Drupal::cache()->set('my_cache_item', $school_list, REQUEST_TIME + (86400));
ブロックのmax-ageを0に変更したい場合は、getCacheMaxAgeメソッドを実装する必要があります。
max-ageの制限
残念ながら、max-ageは匿名ユーザーとDrupalコアのPage Cacheモジュールでは機能しません。たとえば、次の問題を参照してください:
- # 2352009: アイテムのmax-ageをページヘッダーとページキャッシュに転送する
- # 2449749: 特定の時間後に強制的に期限切れにするための#cache ['downstream-ttl']を追加し、#cache ['age']を追加して#cache ['max-age']のロジックを修正する
- # 2835068: PageCacheがキャッシュ不可のレスポンスをキャッシュする(HTTP/1.0仕様に違反)+ D8が意図的にHTTP/1.0プロキシを無効化 = WTF
- # 2951814: キャッシュされないレスポンスでも、X-Drupal-CacheおよびX-Drupal-Dynamic-Cacheヘッダーを常に設定する
これらの(そしておそらく他の)問題が解決されるまで、ページに含まれるレンダー配列にmax-ageを設定するだけでは、max-ageの有効期限後に匿名ユーザーが新しいバージョンを確認できるようにはならないことに注意してください。一方、提供されているCache Control Overrideモジュールは、問題を緩和しようとしています。また、時間に依存するコンテンツを含むページにカスタムキャッシュタグを設定し、hook_cron()でそれらのタグを手動で無効化するという方法もあります。頑張ってください!