モデルキャッシュの検証
前述の通り、表示が劇的に速くなるビューキャッシュですが、若干問題点があります。
特に、閲覧者権限によって、1つの画面に表示/非表示させる部分が複数存在する場合。
前述の通り、cake:nocache でキャッシュせず毎回判断する方法もありますが、数が多いとその負荷も無視できなくなってきます。
モデルキャッシュの方法も検討してみました。
モデルキャッシュの導入方法は、以下に倣いました。
http://www.exgear.jp/blog/2008/11/cakephp12-behavior%E3%81%A7%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%82%AD%E3%83%A3%E3%83%83%E3%82%B7%E3%83%A5%E3%82%92%E8%A1%8C%E3%81%86/
blog.katsuma.tv
CacheBehavoirを追加して、app_model.phpにキャッシュ対応のfind()を作成。
すると、app/tmp/cache以下に、下のようなキャッシュファイルが作成されるようになります。
[cake@cake chara-shee]$ ls app/tmp/cache/
cake_character_cache_method_list
cake_character_find_604800_66667e5a4a6c16509a5a9cc55f2315d5
キャッシュ前後でコントローラの実施速度を比較すると、約半分の時間で済むようになっていました。
キャッシュなし 2010-07-14 19:53:12 Debug: [0a0c8bca] 0.00001 : <==construct : 2010-07-14 19:53:12 Debug: [0a0c8bca] 0.17375 : characters/view: beforeFilterStart : 2010-07-14 19:53:12 Debug: [0a0c8bca] 0.44234 : characters/view: beforeRenderStart : 2010-07-14 19:53:13 Debug: [0a0c8bca] 1.07218 : characters/view: afterFilterStart : 2010-07-14 19:53:13 Debug: [0a0c8bca] 1.09742 : <==destruct : キャッシュあり 2010-07-14 19:53:19 Debug: [0ef6f3e4] 0.00001 : <==construct : 2010-07-14 19:53:19 Debug: [0ef6f3e4] 0.06867 : characters/view: beforeFilterStart : 2010-07-14 19:53:19 Debug: [0ef6f3e4] 0.19387 : characters/view: beforeRenderStart : 2010-07-14 19:53:19 Debug: [0ef6f3e4] 0.56219 : characters/view: afterFilterStart : 2010-07-14 19:53:19 Debug: [0ef6f3e4] 0.57164 : <==destruct :
しかし、ApacheBenchmarkで測定すると、アクション出力速度は約1.5回/秒・・・ビューキャッシュほどの効果は得られていません。
メインはビューキャッシュで、状況に応じてモデルキャッシュを組み合わせるのがよさそうです。
モデルキャッシュ導入差分
app/models/app_model.php
@@ -8,6 +8,7 @@ class AppModel extends Model { var $actsAs = array( 'Containable', + 'Cache', ); @@ -376,5 +377,18 @@ class AppModel extends Model { + function find($type = null, $queryData = array()) + { + $args = array($type, $queryData); + if ($this->Behaviors->attached('Cache')) { + if ($this->cacheEnabled()) { + return $this->cacheMethod(Configure::read('Cache.expir + } + } + + return parent::find($type, $queryData); + } }
CacheBehavoirは、参考URLに同じ