CakePHP2.0のキャッシュとレスポンス(CakePHP Advent Calendar 2011 8日目)
この記事はCakePHP Advent Calendar 2011に参加しています。
cakephp2.0でmodelキャッシュやviewキャッシュってあるけど、実際使ったらレスポンスってどうなるの?というのを検証してみたいと思います。
前提
環境は以下で試しております。
さくらVPS512(512M)
centOS 5.6
apache 2.2.3
mysql 5.5
php 5.2
cakephp 2.0.4
apc 3.1.9
今回初めてcakephp2.0触ったのですが、これを期にcakephp.orgに寄付しました(ドヤッ(キリッ
円高の今がチャンスです!
検証方法
簡単なページ(レコード10万件から10件ランダムに抽出して一覧表示するページ)を作って、abを使ってRequests per secondの値を見て、比較していきます。
ab -c 10 -n 10 (url)
比較順は以下
デフォルト(そのまま)
modelキャッシュする
viewキャッシュする
始める前に一つ注意。cakephp2.0からmysqlの接続にpdo使ってたんですね!
これでハマってしまいました><さすがにcakephp2.0がエラーで「pdoが無いですよ!」とは教えてくれなかったので、初めて使う人はご注意を!
phpinfo()で以下のようになってればOKです。

なってない方は、この辺を参考にインストールしましょう。
結果
結果から書きます。
デフォルト : 3.22
modelキャッシュ : 74.43
viewキャッシュ : 116.30
こうなりました。modelキャッシュで20倍以上、viewキャッシュで30倍以上のレスポンスが出ました!
では、簡単に検証内容を説明します。
デフォルト
コントローラの中身はこんな感じ
$options = array();
$options["limit"] = 10;
$options["order"] = "RAND()";
$t = $this->Model->find("all",$options);
$this->set("t",$t);
ランダムで10件引っ張ってきてます。
デバッグによると、このクエリでだいたい平均400msかかってました。
わりと重めのクエリです。
modelキャッシュ
$t = Cache::read("cache_name");
if(!$t){
$options = array();
$options["limit"] = 10;
$options["order"] = "RAND()";
$t = $this->Model->find("all",$options);
Cache::write("cache_name",$t);
}
$this->set("t",$t);
結果をキャッシュして、キャッシュがあればキャッシュを表示させてます。
そのために、上記で400msかかるクエリが発行されなくなったので、速度アップにつながった訳です。
viewキャッシュ
Config/core.php にて
Configure::write('Cache.check', true);
Cache.checkをtrueにして、Controller 内で
var $cacheAction = Array(
'action_name' => 3600,
);
cacheAction プロパティを設定しました。
viewキャッシュができると、そもそもcontrollerやmodelやviewがすべてすっ飛ばされて、キャッシュファイルだけ実行されるようになります。なので断然早くなるわけですね。
※ただし、実はviewキャッシュはうまく動かなかったので、コアなところをイジって無理矢理動作させてます(汗
まとめ
cakephp2.0でのキャッシュを利用したらこんだけレスポンスが変わりました!って内容でした。
もちろん、みなさんの環境で結果は大きく変わってきますが、キャッシュを利用する際に少しでも参考になればと思います。
さて、この次は、@yashioさんです。よろしくお願いします!