key-valueストア用DataSource(CakePHP1.2)

key-valueストア用の DataSource サンプルをgithubで公開しておきます。

cakephp-key-value-source – ver.0.1

以下の説明はバージョン0.1を対象としたものです

以下のクラスが含まれています:

KeyValueSource
抽象ベースクラス。サブクラスでは最低限 get/set/del/count 4つのメソッドを実装する
JsonFileSource
jsonエンコードしてローカルファイルに保存する実装例
MemcacheSource
pecl-memcache を用いる実装例

CakePHPバージョン1.2の DataSource の仕組みはまだまだ未成熟で、あまり突っ込んだ説明は書きにくいので、詳しく知りたい方はコードを読んでください。スキーマ・レスな(スキーマの設定を DataSource側ではなく Model 側で行う)Sourceの例としては最小限の構成になっているはずです。

使用例

database.php

class DATABASE_CONFIG
{
  var $json = array('datasource' => 'json_file',
                    'root' => TMP,
                    'path' => '/json-encoded');
 
  var $memcache = array('datasource' => 'memcache',
                        'host' => 'localhost',
                        'port' => 11211,
                        'default_expire' => 3600,
                        'default_flag' => 0);
}

モデル

class Foo extends AppModel
{
  //どちらを使ったとしても、基本的な機能を使う限り、全く同じ動作になる
  var $useDbConfig = 'json';
  //var $useDbConfig = 'memcache';
 
  /*
    スキーマの設定
    id には length 必須(特に意味がなくても)
  */
  var $_schema = array('id' => array('type' => 'integer', 'length' => 4),
                       'bar_count' => array('type' => 'integer'),
                       'baz_count' => array('type' => 'integer')
                       /* ... */);
}

コントローラ

//保存するデータの構造などはDBを使う場合と同じ
$data = array('Foo' => array('id' => 1,
                             'bar_count' => 1000,
                             /* ... */));
 
//保存
$this->Foo->save($data);
 
//読み出し
$data = $this->Foo->read(null, 1);
 
//戻り値の構造もDBを使う場合と同じ
$barCount = $data['Foo']['bar_count'];

この程度の使い方だと cache と大して変わらないので、バックエンド固有の機能も少しだけ実装してみました。JsonFileSource は decode オプションを指定することでJSONからのデコード方法を指定できます。false を指定すればJSON(文字列)のまま取り出すこともできます。

//JSONのオブジェクトをPHPのオブジェクトとしてデコード(デフォルトでは連想配列)
$obj = $this->Foo->find('first',
                        array('conditions' => array('Foo.id' => 1),
                              'decode' => 'object'));
$bar = $obj['Foo']->bar_count;
 
//JSON文字列のまま取り出す
$data = $this->Foo->find('first',
                         array('conditions' => array('Foo.id' => 1),
                               'decode' => false));
$json = $data['Foo'];

MemcacheSource はモデルの expires プロパティでデータの有効期限を設定できます。

//期限無制限に
$this->Foo->expire = 0;
$this->Foo->save($data);

参考:

簡単DataSourceの作り方
countまわりの実装など参考にしました。こちらではbakeで動かすことが主眼となっていますが、私のサンプルはbakeでは動かないはずです(bake自体使わないので)

Leave a Reply