2010-10-10 70 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从数据库中获取数据,并存储在缓存... 下一次你不需要从数据库获取数据。您可以轻松快速地从缓存中访问该数据。

相关问题