この記事は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の値を見て、比較していきます。
比較順は以下
- デフォルト(そのまま)
- 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さんです。よろしくお願いします!