2 フォロワー

HTTP キャッシング

前のセクションで説明したサーバーサイドキャッシングに加えて、Web アプリケーションはクライアントサイドキャッシングを利用して、同じページコンテンツを生成および送信する時間を節約することもできます。

クライアントサイドキャッシングを使用するには、クライアント側でレンダリング結果をキャッシュできるコントローラーアクションのフィルタとして yii\filters\HttpCache を設定できます。HttpCacheGET および 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プロパティを設定する必要があります。このプロパティは、publicprivateprivate_no_expirenocacheを含む文字列値を取ることができます。これらの値の説明については、PHPマニュアルのsession_cache_limiter()を参照してください。

SEOへの影響

検索エンジンのボットは、キャッシュヘッダーを尊重する傾向があります。一部のクローラーは、特定の時間内に処理するドメインあたりのページ数に制限があるため、キャッシュヘッダーを導入すると、処理する必要があるページ数が減るため、サイトのインデックス作成に役立つ可能性があります。

タイプミスを見つけましたか?または、このページを改善する必要があると思いますか?
GitHubで編集する !