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自体使わないので)