我正在尋找實施緩存Zend_Db
,沒有任何本地方法提供緩存到Zend_Db
,所以我想知道我應該在哪裏做。我應該在Zend_Db中實現緩存?
我接過來一看至Zend_Db_Table_Abstract
(我擴展它在一個自定義App_Model_DbTable_Abstract
),我發現了一個受保護的方法_fetch()
直接採取Zend_Db_Table_Select
實例,貌似是適配器之前的最後一步。
我在考慮重寫此方法,序列化$select
對象,對其進行散列並最終對其進行緩存,並檢查提供的每個$ select對象以返回緩存還是最新的行集。
這是一個正確的方法嗎?
這裏是我只是做:
class App_Model_DbTable_Abstract extends Zend_Db_Table_Abstract
{
protected function _fetch(Zend_Db_Table_Select $select)
{
$hashedQuery = sha1(serialize($select->__toString()));
$cacheManager = Zend_Registry::get('Zend_Cache_Manager');
$cache = $cacheManager->getCache('database');
if (!($data = $cache->load($hashedQuery))) {
$data = parent::_fetch($select);
$cache->save($data, $hashedQuery);
}
return $data;
}
}
感謝您的回答,在閱讀幻燈片後,我認爲裝飾師會做的伎倆,因爲我有時只是在視圖中訪問模型時繞過控制器,我不想在那裏實現我的緩存,而是一個裝飾物體因爲緩存不在視圖和/或控制器中完成。 – John 2010-10-11 10:06:44
@John:祝你好運!我不確定我是否同意在視圖中調用模型,但只要您對此感到滿意即可。:)(我對視圖的看法是,它們應該是愚蠢的,只是接受在主題上拋出的任何數據 - 即他們不應該知道任何東西,只是模型中最簡單的方法)。 – chelmertz 2010-10-11 13:56:41