0 follower

フラグメントキャッシュ

フラグメントキャッシュはページの断片をキャッシュする事を指します。 たとえば、ページ中に年間売り上げサマリの表がある場合、 リクエスト毎にこれを生成する時間をなくすために、この表をキャッシュに保持できます。

フラグメントキャッシュを利用するには、 CController::beginCache()CController::endCache() をコントローラの ビュースクリプトで呼び出します。2 つのメソッドはキャッシュされるべき ページ内容の始めと終わりをそれぞれマークします。 データキャッシュ と同じように、 キャッシュされる断片を識別するために、ID が必要です。

...他の HTML コンテンツ...
<?php if($this->beginCache($id)) { ?>
...キャッシュされるコンテンツ...
<?php $this->endCache(); } ?>
...他の HTML コンテンツ...

上記中で、beginCache() が false を返したら、 キャッシュ内容がその場所に自動的に挿入されます。そうでなければ、 上記中の if 文が実行され、endCache() が呼び出されるまでの内容がキャッシュされます。

1. キャッシュオプション

beginCache() を呼び出す際、 フラグメントキャッシュをカスタマイズするために、キャッシュオプションを配列として、 2 番目のパラメータに指定することが可能です。 実は、beginCache()endCache() メソッドは COutputCache ウィジェットの 便利なラッパーです。したがって、キャッシュオプションは COutputCache の 任意のプロパティのためのデフォルト値でありえます。

Duration(持続期間)

おそらく、もっとも一般的なオプションは、どれくらいの時間キャッシュが 有効であるかを指定する duration です。 これは、CCache::set() の有効期限パラメータに似ています。 下記のコードは最大 1 時間、コンテンツの断片をキャッシュします。

...他の HTML コンテンツ...
<?php if($this->beginCache($id, array('duration'=>3600))) { ?>
...キャッシュされるコンテンツ...
<?php $this->endCache(); } ?>
...他の HTML コンテンツ...

duration オプションを設定しない場合、この値はデフォルト値(60)が用いられ、 60秒後にキャッシュされたコンテンツが無効にされます。

Dependency(依存関係)

データキャッシュ のように、フラグメントキャッシュも、 キャッシュ依存関係を持つことが出来ます。たとえば、表示されている投稿内容は 投稿内容が修正されたかどうかに依存します。

依存関係を指定するためには、dependency オプション (ICacheDependency をインプリメントするオブジェクトか、 依存関係オブジェクトを生成するために使用できる設定の配列のいずれか)を設定します。 下記コードは、断片のコンテンツがデータベースの lastModified カラム値の変更に 依存することを指定しています。

...他の HTML コンテンツ...
<?php if($this->beginCache($id, array('dependency'=>array(
        'class'=>'system.caching.dependencies.CDbCacheDependency',
        'sql'=>'SELECT MAX(lastModified) FROM Post')))) { ?>
...キャッシュされるコンテンツ...
<?php $this->endCache(); } ?>
...他の HTML コンテンツ...

バリエーション

キャッシュされているコンテンツは、いくつかのパラメータにより 変化する場合があります。たとえば、パーソナルプロフィールは ユーザによって異なって見えるかもしれません。 プロフィールの内容をキャッシュした際に、キャッシュされたコピーが ユーザー ID によって変化して欲しい場合、本来は、 beginCache() を呼ぶ際に 異なるIDを使うべきです。

あるスキームによってIDを変化させるように開発者に依頼する代わりに、 ビルトインされた COutputCache を使ってこのような機能を実現できます。 下記は概要です:

  • varyByRoute: このオプションを true に設定することで、キャッシュされたコンテンツは ルート(道筋) によって 変化させられます。したがって、要求されたコントローラとアクションの それぞれの組み合わせにより、個別にキャッシュされます。

  • varyBySession: このオプションを true に設定することで、セッション ID によって変化するキャッシュされたコンテンツを 作る事ができます。したがって、それぞれのユーザセッションは異なるコンテンツを 見てもよく、それらはキャッシュから全て読み出されます。

  • varyByParam: このオプションに名前の配列を 設定することで、指定された GET パラメータの値によって変化する キャッシュされたコンテンツを作る事ができます。 たとえば、ページで id GET パラメータにより投稿内容を表示する場合、 array('id')varyByParam に指定する事で、 各投稿内容をキャッシュする事ができます。このような変化がない場合、 単に単一の投稿内容がキャッシュされます。

  • varyByExpression: このオプションにPHP表現を設定することで、 キャッシュされた内容をこのPHP表現の結果で変化させることができます。 このオプションは、バージョン1.0.4から利用できます。

Request Typesリクエストタイプ

あるリクエストタイプの場合のみでフラグメントキャッシュを有効にしたい 場合があります。たとえば、フォームを表示するページでは、 最初にリクエストされた場合(GET リクエストにより)にのみキャッシュしたく、 その後のフォームの表示(POST リクエストによる)は、フォームにユーザ入力が 含まれている可能性があるため、キャッシュされるべきではありません。 そのような場合、requestTypes オプションを 指定することができます:

...他の HTML コンテンツ...
<?php if($this->beginCache($id, array('requestTypes'=>array('GET')))) { ?>
...キャッシュされるコンテンツ...
<?php $this->endCache(); } ?>
...他の HTML コンテンツ...

2. キャッシュのネスト化

フラグメントキャッシュはネスト化することができます。すなわち、 キャッシュされた断片はキャッシュされるより大きな断片で囲まれます。 たとえば、コメントは内側のフラグメントキャッシュ内にキャッシュされ、 それらは外側のフラグメントキャッシュ内に投稿内容と一緒にキャッシュされます。

...他の HTML コンテンツ...
<?php if($this->beginCache($id1)) { ?>
...外側のキャッシュされるコンテンツ...
    <?php if($this->beginCache($id2)) { ?>
    ...内側のキャッシュされるコンテンツ...
    <?php $this->endCache(); } ?>
...外側のキャッシュされるコンテンツ...
<?php $this->endCache(); } ?>
...他の HTML コンテンツ...

ネスト化されたキャッシュに異なるキャッシュオプションを 設定することもできます。 たとえば、上記の例における内側のキャッシュと外側のキャッシュは、 異なる duration(持続期間)値を設定する事が可能です。 外側のキャッシュで、キャッシュされたデータが無効にされるとき、 内側のキャッシュは、まだ有効な内側の断片を提供する可能性があります。 しかし、逆の場合については、前述の挙動とは異なり、 外側のキャッシュが有効であれば、内側のキャッシュコンテンツの持続期間が 終了していたとしても、常にキャッシュされたコピーを提供します。