ビューキャッシュを使うとかなりパフォーマンスが向上するらしい。
静的なページには物凄く簡単に使える。
使い方もすぐ出てくる。
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にして、別途にキャッシュをつくっとく方がいいっぽい。
LIGはWebサイト制作を支援しています。ご興味のある方は事業ぺージをぜひご覧ください。