フラグメントキャッシュはページの断片をキャッシュする事を指します。 たとえば、ページ中に年間売り上げサマリの表がある場合、 リクエスト毎にこれを生成する時間をなくすために、この表をキャッシュに保持できます。
フラグメントキャッシュを利用するには、 CController::beginCache() と CController::endCache() をコントローラの ビュースクリプトで呼び出します。2 つのメソッドはキャッシュされるべき ページ内容の始めと終わりをそれぞれマークします。 データキャッシュ と同じように、 キャッシュされる断片を識別するために、ID が必要です。
...他の HTML コンテンツ... if($this->beginCache($id)) { ...キャッシュされるコンテンツ... $this->endCache(); } ...他の HTML コンテンツ...
上記中で、beginCache() が false を返したら、
キャッシュ内容がその場所に自動的に挿入されます。そうでなければ、
上記中の if
文が実行され、endCache()
が呼び出されるまでの内容がキャッシュされます。
beginCache() を呼び出す際、 フラグメントキャッシュをカスタマイズするために、キャッシュオプションを配列として、 2 番目のパラメータに指定することが可能です。 実は、beginCache() と endCache() メソッドは COutputCache ウィジェットの 便利なラッパーです。したがって、キャッシュオプションは COutputCache の 任意のプロパティのためのデフォルト値でありえます。
おそらく、もっとも一般的なオプションは、どれくらいの時間キャッシュが 有効であるかを指定する duration です。 これは、CCache::set() の有効期限パラメータに似ています。 下記のコードは最大 1 時間、コンテンツの断片をキャッシュします。
...他の HTML コンテンツ... if($this->beginCache($id, array('duration'=>3600))) { ...キャッシュされるコンテンツ... $this->endCache(); } ...他の HTML コンテンツ...
duration オプションを設定しない場合、この値はデフォルト値(60)が用いられ、 60秒後にキャッシュされたコンテンツが無効にされます。
データキャッシュ のように、フラグメントキャッシュも、 キャッシュ依存関係を持つことが出来ます。たとえば、表示されている投稿内容は 投稿内容が修正されたかどうかに依存します。
依存関係を指定するためには、dependency オプション
(ICacheDependency をインプリメントするオブジェクトか、
依存関係オブジェクトを生成するために使用できる設定の配列のいずれか)を設定します。
下記コードは、断片のコンテンツがデータベースの lastModified
カラム値の変更に
依存することを指定しています。
...他の HTML コンテンツ... if($this->beginCache($id, array('dependency'=>array( 'class'=>'system.caching.dependencies.CDbCacheDependency', 'sql'=>'SELECT MAX(lastModified) FROM Post')))) { ...キャッシュされるコンテンツ... $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から利用できます。
あるリクエストタイプの場合のみでフラグメントキャッシュを有効にしたい 場合があります。たとえば、フォームを表示するページでは、 最初にリクエストされた場合(GET リクエストにより)にのみキャッシュしたく、 その後のフォームの表示(POST リクエストによる)は、フォームにユーザ入力が 含まれている可能性があるため、キャッシュされるべきではありません。 そのような場合、requestTypes オプションを 指定することができます:
...他の HTML コンテンツ... if($this->beginCache($id, array('requestTypes'=>array('GET')))) { ...キャッシュされるコンテンツ... $this->endCache(); } ...他の HTML コンテンツ...
フラグメントキャッシュはネスト化することができます。すなわち、 キャッシュされた断片はキャッシュされるより大きな断片で囲まれます。 たとえば、コメントは内側のフラグメントキャッシュ内にキャッシュされ、 それらは外側のフラグメントキャッシュ内に投稿内容と一緒にキャッシュされます。
...他の HTML コンテンツ... if($this->beginCache($id1)) { ...外側のキャッシュされるコンテンツ... if($this->beginCache($id2)) { ...内側のキャッシュされるコンテンツ... $this->endCache(); } ...外側のキャッシュされるコンテンツ... $this->endCache(); } ...他の HTML コンテンツ...
ネスト化されたキャッシュに異なるキャッシュオプションを 設定することもできます。 たとえば、上記の例における内側のキャッシュと外側のキャッシュは、 異なる duration(持続期間)値を設定する事が可能です。 外側のキャッシュで、キャッシュされたデータが無効にされるとき、 内側のキャッシュは、まだ有効な内側の断片を提供する可能性があります。 しかし、逆の場合については、前述の挙動とは異なり、 外側のキャッシュが有効であれば、内側のキャッシュコンテンツの持続期間が 終了していたとしても、常にキャッシュされたコピーを提供します。
Signup or Login in order to comment.