Zend Framework メタデータをキャッシュする


Zend Framework のメタデータキャッシュ方法がよく分からなかったのですが
無事、ファイルキャッシュできるようになったので書き留めておきます。

application/configs/application.ini の例
—————————————————————————————-
resources.cachemanager.database.frontend.name = Core
resources.cachemanager.database.frontend.options.lifetime = 3600
resources.cachemanager.database.frontend.options.automatic_serialization = true
resources.cachemanager.database.backend.name = File
resources.cachemanager.database.backend.options.cache_dir = 任意のディレクトリPATH
—————————————————————————————-
resources.multidb.defaultMetadataCache = “database”  ・・・①
—————————————————————————————-

①については、この場合は複数DB向け(multidb)としていますが、単一DBの方は
「resources.db.defaultMetadataCache = “database”」としているかもしれません。

application/Bootstrap.php の例
—————————————————————————————-
protected function _initCache()
{
$resource = $this->getPluginResource(‘cachemanager’)->getCacheManager();
Zend_Registry::set(‘cache’,  $resource->getCache(‘database’));
}
—————————————————————————————-
DBなどの初期化は全てBootstrapにまとめているので、ここにキャッシュ初期化用のコードを追加しました。
ここまでで、キャッシュの準備は終わりです。

キャッシュさせたいコントローラにて
—————————————————————————————-
public $cache;
$this->cache = Zend_Registry::get(‘cache’);

if($this->cache->test(‘任意のキャッシュID’)) { // キャッシュあり?
$result = $this->cache->load(‘任意のキャッシュID’); // キャッシュをload
} else {
$result = $this->db->fetchAll($sql);
$this->cache->save($result, ‘任意のキャッシュID’); // キャッシュをsave
}
—————————————————————————————-
※任意のキャッシュID は3箇所同じにします。

キャッシュが効けば、application.ini で指定した「任意のディレクトリPATH」にキャッシュファイルが吐き出されます。

効果ですが、「Apache Bench」で測定したところ、キャッシュヒットにて約4倍の速度UPとなりました。
効果ありですね。

追伸
注意点としては、’任意のキ
ャッシュID’ をユニークにすることです。(そうしないと、無関係のキャッシュを読み込んでしまいます…)
関数名やSQLのWHERE条件などを含めて、ID化するとよいかもしれません。