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

Kazuya Takato

Kazuya Takato

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

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

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サイト制作を支援しています。ご興味のある方は事業ぺージをぜひご覧ください。

Webサイト制作の実績・料金を見る

この記事のシェア数

Kazuya Takato
Kazuya Takato 取締役 COO 兼 CTO / DX事業本部長 / 高遠 和也

1983年生まれ。SIerとしてのキャリアをスタートし、JavaやC#を中心に多岐にわたる開発プロジェクトにエンジニアとして参加。その経験を活かし、LIGを創業。バックエンドおよびフロントエンドエンジニアとしての深い知識と経験をもとに、多様なプロジェクトに従事。現在は、取締役COO兼CTO、DX事業本部長として、社内の体制やルールの最適化、AI技術の推進など、経営戦略の一翼を担う。

このメンバーの記事をもっと読む
デザイン力×グローバルな開発体制でDXをトータル支援
お問い合わせ 会社概要DL