私が書かなくても替わりはいるもの。
私はたぶん3日坊主だと思うから…


さて少し技術的?なお話でも。

最近調べまくっていた、CakePHPでのキャッシュ問題や
設定などについてちょろっと書いてみます。

PHPでのキャッシュとは仕様がだいぶ異なるCakeのキャッシュ機構。
少し、というかかなーり不明な部分や特殊な箇所でハマっていました。

で、結論から書くと
  • ページ内をパーツ化(element)化する
  • キャッシュエンジンを取捨選択する
  • 静的ページは積極的にキャッシュ
  • キャッシュ時間を細分化する
  • なんでもかんでもキャッシュしない
全部は説明しきれないので、パーツ化とキャッシュの基本設定だけ紹介。



  キャッシュを利用するための前準備

app/config/Core.php内で下記のようにする。


Configure::write('Cache.disable', false); // true を false に修正
Configure::write('Cache.check', true);


キャッシュさせたいページのコントローラー内でキャッシュヘルパーを呼ぶ。


var $helpers = array('Cache');


※注意点
Configure::write('Cache.disable',true)のままだとキャッシュが動きません!



  element化とかいらなくね?

例えば、TOPページにランキングのようにデータが変わるような表示箇所があるとします。
その際に、アクセスが一番多いしTOPをキャッシュしちゃえと思いますよね。
であなたがログインしたその瞬間、まさにキャッシュが動いたとすると・・・

○○さんがログイン中です
のような状態のまま保存されてしまう!

ヽ(`Д´)ノウワァァァン!!
うん、やっちゃったね☆

で、そんな事態を避けるために必要なのがelement化ですよと。



  viewページのelement化とは?
CakePHPには、ページを小分け(パーツ化)して読み込ませるような仕組みがあります。
app/view/elemets/フォルダ名/以下に配置します。
本来の使い方としては、ヘッダーやフッターなど全ページでかなり使われるものを置いておくのですが、ページのパーツ単位でわけて使うようなことも出来ます。

変数もコントローラー内で

$this->set('ranking',$ranking);

とやるだけで、普通に使えるので問題なし。

view側(呼び出し側)で下記のようにすればelementフォルダ以下に配置したctpファイルを読み出すことが出来ます。

$this->renderElement('フォルダ名/エレメント');

簡単ですね。
(あくまでキャッシュではなく、パーツ化したのを呼んでいるだけです)


  elementのキャッシュ方法

前置きが長くなりましたが、せっかくelement化したのをどうやってキャッシュするのか?
呼び出し元viewファイル内でrenderElementするかわりにこうします。


// 12時間ランキングページキャッシュ
$this->element('top_page_ranking' ,array('cache'=>array('time'=>"+12 hours"));


これだけでOKです!
2つ目の引数の、cache部分には他にも値を渡せたりするのですが、使いこなす頃には別サイトでも参考にしてくださいw

他にも個別のキャッシュ削除や、時間設定、一部分だけキャッシュさせないなどのテクニックはありますが、とりあえず使ってみたい人向けということで今回はおしまいです。

ちなみに自分はHTMLキャッシュヘルパーは使用していません。
元々、現在のサイトがキャッシュ使用していないのと、element化がされておらず今からやる手間がないからですがw

ゆくゆくは、ヘッダーとフッターくらいは静的ページのキャッシュとして置いておきたいですな。