2010-10-10 76 views
3

我正在尋找實施緩存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; 
    } 
} 

回答

3

據我所知,zf create db-table <name>總是會創建一個類繼承Zend_Db_Table_Abstract這將使你的建議難以管理。

此外,您將耦合ZF的db模塊的高速緩存&,因此您可能會認爲將高速緩存機制置於dbtable範圍下是不正確的。例如:你不應該知道的數據是從獲取,但仍然能夠緩存,所以過程變得這樣的:

  1. 數據檢查緩存,如果找到
  2. 從X取數據服務(可能是DBTABLE,也可能是一個服務,一個XML文件,一些JSON等)
  3. 保存在緩存中的數據和服務因此,儘管你的解決方案現在是有道理的,因爲你只使用DBTABLE模型數據

,它可以被放置在更適合的層中。我會查看http://www.slideshare.net/weierophinney/playdoh-modelling-your-objects-1766001(幻燈片#35附近)的實用解決方案。

摘要:dbtable模塊和你的代碼應該總是關於使用db。

+0

感謝您的回答,在閱讀幻燈片後,我認爲裝飾師會做的伎倆,因爲我有時只是在視圖中訪問模型時繞過控制器,我不想在那裏實現我的緩存,而是一個裝飾物體因爲緩存不在視圖和/或控制器中完成。 – John 2010-10-11 10:06:44

+0

@John:祝你好運!我不確定我是否同意在視圖中調用模型,但只要您對此感到滿意即可。:)(我對視圖的看法是,它們應該是愚蠢的,只是接受在主題上拋出的任何數據 - 即他們不應該知道任何東西,只是模型中最簡單的方法)。 – chelmertz 2010-10-11 13:56:41

3
public function indexAction() 
     { 
      // action body 
      $this->_helper->layout->setLayout('layout'); 

      $db = new Zend_Db_Adapter_Pdo_Mysql(array('host' => 'localhost', 
            'username' => 'root', 
            'password' => '', 
             'dbname' => 'zendtest')); 
      $sql = "SELECT SQL_CALC_FOUND_ROWS " 
         . "  register.firstname, " 
         . "  register.lastname, " 
         . "  register.username, " 
         . "  register.password, " 
         . "  register.email, " 
         . "  register.city, " 
         . "  register.state, " 
         . "  register.contactno "  
         . " FROM register register " 
         . " WHERE register.id = ? ";        

       $result = $db->fetchall($sql,1);  

         $result1 = ""; 
       $cache = Zend_Registry::get('cache'); 

       if(!$result1 = $cache->load('mydata2')) { 
        echo 'caching the data…..'; 
        $cache->save($result, 'mydata2'); 
        } else { 
        echo 'retrieving cache data…….'; 
        Zend_Debug::dump($result1); 
        } 
} 

在引導文件中定義緩存陣列然後使用Zend DB從數據庫中獲取數據,並存儲在緩存... 下一次你不需要從數據庫獲取數據。您可以輕鬆快速地從緩存中訪問該數據。