modelの任意のメソッドをキャッシュする

CacheBehaviorを作る

[cakephpインストールディレクトリ]/app/models/behaviors/cache.php

class CacheBehavior extends ModelBehavior {

static $cacheData = array();
var $enabled = true;

function setup(&$model, $config = array()) {}

/**
* メソッドキャッシュ
*/
function cacheMethod(&$model, $expire, $method, $args = array()){

$this->enabled = false;
// キャッシュキー
$cachekey = get_class($model) . '_' . $method . '_' . $expire . '_' . md5(serialize($args));

// 変数キャッシュの場合
if(!$expire){
if (isset($this->cacheData[$cachekey])) {
$this->enabled = true;
return $this->cacheData[$cachekey];
}
$ret = call_user_func_array(array($model, $method), $args);
$this->enabled = true;
$this->cacheData[$cachekey] = $ret;
return $ret;
}

// サーバーキャッシュの場合
$ret = Cache::read($cachekey);
if(!empty($ret)){
$this->enabled = true;
return $ret;
}
$ret = call_user_func_array(array($model, $method), $args);
$this->enabled = true;
Cache::write($cachekey, $ret, $expire);

// クリア用にモデル毎のキャッシュキーリストを作成
$cacheListKey = get_class($model) . '_cacheMethodList';
$list = Cache::read($cacheListKey);
$list[$cachekey] = 1;
Cache::write($cacheListKey, $list);
return $ret;
}

/**
* 再帰防止判定用
*/
function cacheEnabled(&$model){
return $this->enabled;
}

/**
* キャッシュクリア
*/
function cacheDelete(&$model){
$cacheListKey = get_class($model) . '_cacheMethodList';
$list = Cache::read($cacheListKey);
if(empty($list)) return;
foreach($list as $key => $tmp){
Cache::delete($key);
}
Cache::delete($cacheListKey);
}

/**
* 追加・変更・削除時にはキャッシュをクリア
*/
function afterSave(&$model, $created) {
$this->cacheDelete($model);
}
function afterDelete(&$model) {
$this->cacheDelete($model);
}
}

機能説明

1.モデル内の任意のメソッドの結果をキャッシュする
2.キャッシュ有効期限を指定しない(もしくは0を指定)場合は、変数にキャッシュする(同一のリクエスト内で有効)
3.モデルのデータ内容に変化(追加・更新・削除)があった場合には自動的にキャッシュをクリアする
4.コントローラーからモデルのメソッドを呼び出す際にキャッシュを実装可能にする

使い方

以下をmodelのfunctionの先頭に追加。
キャッシュの有効時間は秒指定です。
この例では30日間キャッシュを有効にします。


if ($this->Behaviors->attached('Cache')) {

$args = func_get_args();
if($this->cacheEnabled()) {
return $this->cacheMethod('2592000', __FUNCTION__, $args);
}
}

0 コメント: