前のセクションで説明したサーバーサイドキャッシングに加えて、Web アプリケーションはクライアントサイドキャッシングを利用して、同じページコンテンツを生成および送信する時間を節約することもできます。
クライアントサイドキャッシングを使用するには、クライアント側でレンダリング結果をキャッシュできるコントローラーアクションのフィルタとして yii\filters\HttpCache を設定できます。HttpCache は GET
および HEAD
リクエストでのみ機能します。これらのリクエストに対して、3 種類のキャッシュ関連 HTTP ヘッダーを処理できます。
Last-Modified
ヘッダー ¶Last-Modified
ヘッダーは、タイムスタンプを使用して、クライアントがキャッシュしてからページが変更されたかどうかを示します。
Last-Modified
ヘッダーの送信を有効にするには、yii\filters\HttpCache::$lastModified プロパティを設定できます。このプロパティは、ページ変更時刻に関する UNIX タイムスタンプを返す PHP の callable である必要があります。PHP の callable のシグネチャは次のようになります。
/**
* @param Action $action the action object that is being handled currently
* @param array $params the value of the "params" property
* @return int a UNIX timestamp representing the page modification time
*/
function ($action, $params)
以下は、Last-Modified
ヘッダーを利用する例です。
public function behaviors()
{
return [
[
'class' => 'yii\filters\HttpCache',
'only' => ['index'],
'lastModified' => function ($action, $params) {
$q = new \yii\db\Query();
return $q->from('post')->max('updated_at');
},
],
];
}
上記のコードは、index
アクションに対してのみ HTTP キャッシングを有効にする必要があることを示しています。投稿の最終更新時間に基づいて Last-Modified
HTTP ヘッダーを生成する必要があります。ブラウザが index
ページに初めてアクセスすると、ページはサーバーで生成され、ブラウザに送信されます。ブラウザが同じページに再度アクセスし、その間に投稿が変更されていない場合、サーバーはページを再生成せず、ブラウザはクライアント側のキャッシュされたバージョンを使用します。その結果、サーバーサイドのレンダリングとページコンテンツの送信の両方がスキップされます。
ETag
ヘッダー ¶「エンティティタグ」(または略して ETag
)ヘッダーは、ページのコンテンツを表すハッシュを使用します。ページが変更されると、ハッシュも変更されます。クライアント側に保持されているハッシュとサーバー側で生成されたハッシュを比較することで、キャッシュはページが変更されたかどうかを判断し、再送信する必要があるかどうかを判断できます。
ETag
ヘッダーの送信を有効にするには、yii\filters\HttpCache::$etagSeed プロパティを設定できます。このプロパティは、ETag ハッシュを生成するためのシードを返す PHP の callable である必要があります。PHP の callable のシグネチャは次のようになります。
/**
* @param Action $action the action object that is being handled currently
* @param array $params the value of the "params" property
* @return string a string used as the seed for generating an ETag hash
*/
function ($action, $params)
以下は、ETag
ヘッダーを利用する例です。
public function behaviors()
{
return [
[
'class' => 'yii\filters\HttpCache',
'only' => ['view'],
'etagSeed' => function ($action, $params) {
$post = $this->findModel(\Yii::$app->request->get('id'));
return serialize([$post->title, $post->content]);
},
],
];
}
上記のコードは、HTTPキャッシュがview
アクションでのみ有効になるように設定していることを示しています。リクエストされた投稿のタイトルとコンテンツに基づいて、ETag
HTTPヘッダーを生成します。ブラウザが最初にview
ページにアクセスすると、ページはサーバーで生成され、ブラウザに送信されます。ブラウザが同じページに再度アクセスし、投稿のタイトルとコンテンツに変更がない場合、サーバーはページを再生成せず、ブラウザはクライアント側のキャッシュバージョンを使用します。その結果、サーバー側のレンダリングとページコンテンツの送信の両方がスキップされます。
ETagを使用すると、Last-Modified
ヘッダーよりも複雑で、より正確なキャッシュ戦略が可能になります。たとえば、サイトが別のテーマに切り替わった場合、ETagを無効にできます。
高コストなETagの生成は、HttpCache
を使用する目的を損ない、不必要なオーバーヘッドを発生させる可能性があります。なぜなら、ETagはリクエストごとに再評価する必要があるからです。ページコンテンツが変更された場合にキャッシュを無効化する簡単な式を見つけるようにしてください。
注意: RFC 7232に準拠して、
HttpCache
は、ETag
ヘッダーとLast-Modified
ヘッダーの両方が設定されている場合は、両方を送信します。また、クライアントがIf-None-Match
ヘッダーとIf-Modified-Since
ヘッダーの両方を送信した場合、前者のヘッダーのみが優先されます。
Cache-Control
ヘッダー ¶Cache-Control
ヘッダーは、ページの一般的なキャッシュポリシーを指定します。 yii\filters\HttpCache::$cacheControlHeaderプロパティにヘッダー値を設定することで、送信できます。デフォルトでは、次のヘッダーが送信されます。
Cache-Control: public, max-age=3600
ページがセッションを使用している場合、PHPはsession.cache_limiter
PHP INI設定で指定された、キャッシュ関連のHTTPヘッダーを自動的に送信します。これらのヘッダーは、HttpCache
で希望するキャッシュを妨害したり、無効にしたりする可能性があります。この問題を回避するために、デフォルトではHttpCache
はこれらのヘッダーの自動送信を無効にします。この動作を変更する場合は、yii\filters\HttpCache::$sessionCacheLimiterプロパティを設定する必要があります。このプロパティは、public
、private
、private_no_expire
、nocache
を含む文字列値を取ることができます。これらの値の説明については、PHPマニュアルのsession_cache_limiter()を参照してください。
検索エンジンのボットは、キャッシュヘッダーを尊重する傾向があります。一部のクローラーは、特定の時間内に処理するドメインあたりのページ数に制限があるため、キャッシュヘッダーを導入すると、処理する必要があるページ数が減るため、サイトのインデックス作成に役立つ可能性があります。
タイプミスを見つけましたか?または、このページを改善する必要があると思いますか?
GitHubで編集する !
コメントするには、サインアップまたはログインしてください。