2009年7月8日水曜日

Zend_Db_Table_AbstractでZend_Cacheを利用して負荷軽減

どうも俺@ZendFrameworkを利用してWEBアプリを開発中です。

Zend_Db_Tableを継承してクラスを作成すれば、すでに様々なメソッドを持ったクラス(Bean)を作成することができます。
<?php
class MyBean extends Zend_Db_Table {
}

で、このZend_Db_Tableの生成は
<?php
$bean = new MyBean();
です。

<?php
var_dump($bean->info());
とすると、そのテーブルに関するメタデータ情報が連想配列で取得できます。

・name => テーブル名
・cols => テーブルのカラム名の配列
・primary => 主キーのカラム名の配列
・metadeta => カラム名とカラムに関する情報を関連付けた連想配列。discribeTable()と同じ内容
・rowClass => 行オブジェクト(Zend_Db_Table_Row)で使用するクラス名
・rowsetClass => 行セットオブジェクト(Zend_Db_Table_Rowset)で使用するクラス名
・referenceMap => このテーブルが参照する親テーブルの情報を含む連想配列
・dependentTables => このテーブルを参照しているテーブルのクラス名配列

で、このZend_Db_Tableですが、生成する度にdiscribetable()というメソッドが呼ばれテーブル情報を取得します。とても便利なのですが、都度DB接続が行われ非効率すぎるのでZend_Cacheを利用してデータをキャッシュさせておきます。
discribeTable()が走るタイミングは
・insert()
・find()
・info()
を呼んだ時だそうです。
※参照 Zend_Db_Table::メタデータのキャッシュ

<?php
$frontendOpt = array("automatic_serialization"=>true);
$backendOpt = array("cache_dir" => "/path/to/cache_dir");
$cache = Zend_Cache::factory("Core", "File", $frontendOpt, $backendOpt);
Zend_Db_Table_Abstract::setDefaultMetadataCache($cache);

これを、index.phpなどに設定しておけばメタデータキャッシュを利用してくれます。

Zend_Cacheについては公式(Zend_Cache)を参照してね。
以上です。

0 件のコメント: