Webサイト発注虎の巻ダウンロード
Webサイト発注虎の巻ダウンロード

CakePHP1.2のビューキャッシュ(nocacheについて)

づや

ビューキャッシュを使うとかなりパフォーマンスが向上するらしい。

静的なページには物凄く簡単に使える。
使い方もすぐ出てくる。

core.phpのConfigure::write(‘Cache.check’, true);にして、
使いたいコントローラで、ヘルパーにキャッシュを追加して、var $helpers = array(‘Cache’);
var $cacheAction = array(‘index’ => 86400);って変数にアクションと保持する時間を決めてあげる。

問題は、キャッシュしたくない部分。

マニュアルを見ると、

<h1> New Products! </h1>
<cake:nocache>
<ul>
<?php foreach($newProducts as $product): ?>
  <li><?php echo $product['name']; ?></li>
<?php endforeach; ?>
</ul>
</cake:nocache>

<cake:nocache>で囲めばいいよと書いてあるだけ。
たしかに、出来るキャッシュファイルを見ると、囲った部分はこのまま残ってるから効いてるんだけど、
キャッシュがあるとアクションが呼ばれないので、上記の例だと$this->setで設定していた$newProductsがないのでエラーが出る。

じゃあどう値を取得すればいいのかなと思って、調べてみた。

CakePHP User in Japanに「cake:nocacheの謎」というフォーラムがあった。

参交リンクとして、あった「View caching problem with <cake:nocache></cake>」を読んでみた。

たぶん、$this->requestActionでその都度、その部分用の値取得用アクションを呼ぶのがいいよってお話。

今回の例でいうと、$newProducts取得用のアクションを作る。

class ProductsController extends AppController {
    function newProducts() {
     // 処理は適当
        return $this->Products->find('all');
    }
}

Viewをちょっと変更。

<h1> New Products! </h1>
<cake:nocache>
<ul>
<?php $newProducts = $this->requestAction('/products/newProducts'); ?>
<?php foreach($newProducts as $product): ?>
  <li><?php echo $product['name']; ?></li>
<?php endforeach; ?>
</ul>
</cake:nocache>

これで、一応ちゃんと動いた。
でもrequestActionはパフォーマンスが悪いらしい。
キャッシュにしたのに、処理が逆に重くなるような本末転倒な事態も起こりえるかも。
requestActionで呼ぶ処理が重い時は、その部分をelementにして、別途にキャッシュをつくっとく方がいいっぽい。