キャッシュヘルパー

class CacheHelper(View $view, array $settings = array())

キャッシュヘルパーはレイアウトやビューをキャッシュするのを助けてくれ、繰り返しデータを取得する際に時間を節約できます。CakePHP のビューキャッシングは一時的に解析したレイアウトやビューをシンプルな PHP + HTML ファイルとして保存します。キャッシュヘルパーは他のヘルパーとはかなり異なった動作をすることに注意してください。 直接呼び出せるメソッドはありません。 代わりにビューはキャッシュタグでマーキングされ、コンテンツのブロックがキャッシュされていることを示します。 その後、ファイルのプロセスを呼び戻してキャッシュファイルを書き出します。

URL がリクエストされると、Cake はそのリクエストされた文字列がすでにキャッシュされているかどうかを確認します。 もしキャッシュされてれば、ディスパッチプロセスの URL の残りをスキップします。 キャッシュされていないブロックは通常通り処理され、ビューは動作します。 このおかげでキャッシュされた URL への各リクエストは最小限のコードだけが実行されるので実行時間を大きく節約できます。 Cake がキャッシュされたビューを見つけられない場合、あるいはキャッシュがリクエストされた URL の期限を過ぎている場合、通常通りリクエストを処理し続けます。

使い方

キャッシュヘルパーを使用する前に2つのステップをこなさなければなりません。 まず一つ目に APP/Config/core.php にある Configure write で Cache.check をコールしている部分のコメントを外して下さい。 そうするとリクエストを取り扱うときビューキャッシュファイルを確認したり、生成したりするようになります。

Cache.check のコメントを外したならば controller の $helpers 配列にヘルパーを追加しなければなりません。

class PostsController extends AppController {
    public $helpers = array('Cache');
}

環境設定オプションを追加する

キャッシュヘルパーはいくつかの環境設定オプションを持っていて挙動の調整を行うことができます。 この調整は $cacheAction 内で完結します。 $cacheAction はキャッシュして欲しいアクションを含んでいる時や、それらのビューキャッシュが数秒持続して欲しい時には配列をセットするべきです。 時間は strtotime() フォーマットで表現する事ができます. (例: “1 hour”, や “3 minutes”).

ArticlesController の例を使用して、キャッシュする必要のある多くのトラフィックを受け取ります。

public $cacheAction = array(
    'view' => 36000,
    'index'  => 48000
);

上のコードはビューアクションを10時間、そインデックスアクションは13時間キャッシュすることができるものです。 コントローラーのどのアクションにでもキャッシュできます。 どのコントローラーでも $cacheActionstrtotime() の書き方を下記のように親しみやすい記述にすることができます。

public $cacheAction = "1 hour";

さらに、CacheHelper で作成したコントローラー / コンポーネントの callbacks を true にすることができます。 ただし、追加するときは $cacheAction で配列を使って記述してください

public $cacheAction = array(
    'view' => array('callbacks' => true, 'duration' => 21600),
    'add' => array('callbacks' => true, 'duration' => 36000),
    'index' => array('callbacks' => true, 'duration' => 48000)
);

callbacks => true をセットすることによってキャッシュヘルパーにコントローラー用のコンポーネントとモデルを作成するように伝えます。 そして、そのコントローラが初期化され、beforFilterが読まれ、最後にコンポーネントのcallbacksが呼ばれます。

ノート

セットされた callbacks => true 汎用的なキャッシング処理に負けてしまいます。それがデフォルトで true にならない理由です。

ビューでキャッシュされない内容をマークする

場合によっては、完全に ビューをキャッシュしたくないことがあります。 たとえば、ユーザがログインしていようがゲストとしてサイトを閲覧していようが、ページの一部を確実に異なる表示にしたい場合です。

キャッシュ されない コンテンツのブロックを表示するためには、その部分を次のように <!--nocache--> <!--/nocache--> で囲みます

<!--nocache-->
<?php if ($this->Session->check('User.name')): ?>
    Welcome, <?php echo h($this->Session->read('User.name')); ?>.
<?php else: ?>
    <?php echo $html->link('Login', 'users/login'); ?>
<?php endif; ?>
<!--/nocache-->

ノート

エレメントの中で nocache タグを使うことができません。エレメントの周りに callbacksがないのでキャッシュすることができないのです。

一度アクションがキャッシュされると、そのアクションのコントローラは呼び出されない、ということに注意してください。 キャッシュファイルが作られた時、オブジェクトがリクエストされてビューの変数がPHPの serialize() でシリアライズされます。

警告

シリアライズできないコンテンツ(SimpleXML,リソースハンドル,あるいはクロージャ)がビューの変数を含んでいる場合、ビューキャッシングを使用出来るようにしてはいけません。

キャッシュをクリアする

キャッシュされたビューで使用されたモデルが変更されると、Cake はキャッシュされたビューをクリアすることを覚えておくのは重要です。 たとえば、キャッシュされたビューが Post モデルから取得したデータを使用していて、Post で INSERT, UPDATE, DELETE クエリーが生成されると、 そのビューのキャッシュはクリアされ新しいコンテンツが次のリクエストの際に生成されます。

ノート

自動で行うこのキャッシュクリアの処理はURLの一部でコントローラー / モデルに処理を要求します。 もしURLのルーティングを変更していたら、この処理は働きません。

手動でキャッシュをクリアする必要がある場合、Cache::clear() を呼び出すことでできます。 これはビューでないデータを含むキャッシュされたデータ すべて をクリアします。 もしキャッシュされたビューをクリアするならば clearCache() を使用します。