CakePHP2.0のキャッシュとレスポンス(CakePHP Advent Calendar 2011 8日目)

2011/12/08

この記事は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)

比較順は以下

  1. デフォルト(そのまま)
  2. modelキャッシュする
  3. viewキャッシュする

始める前に一つ注意。cakephp2.0からmysqlの接続にpdo使ってたんですね!
これでハマってしまいました><さすがにcakephp2.0がエラーで「pdoが無いですよ!」とは教えてくれなかったので、初めて使う人はご注意を!
phpinfo()で以下のようになってればOKです。
phpinfo_pdo

なってない方は、この辺を参考にインストールしましょう。

結果

結果から書きます。

  1. デフォルト : 3.22
  2. modelキャッシュ : 74.43
  3. 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さんです。よろしくお願いします!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です