3

我正在寻找在 中实现缓存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;
    }
}
4

2 回答 2

3

据我所知,zf create db-table <name>将始终创建一个继承类Zend_Db_Table_Abstract,这会使您的提案难以管理。

此外,您正在耦合 ZF 的缓存和数据库模块,因此有人可能会认为将缓存机制置于 dbtable 范围内是不正确的。例如:你不应该知道数据是从哪里获取的,但仍然可以缓存它,所以过程变成了这样:

  1. 检查缓存中的数据,如果找到则提供
  2. 从 X 获取数据(可以是 dbtable,也可以是服务、XML 文件、一些 JSON 等)
  3. 将数据保存在缓存中并提供数据

因此,尽管您的解决方案现在很有意义,因为您只使用 dbtable 模型,但它可以放置在更合适的层中。我会查看http://www.slideshare.net/weierophinney/playdoh-modelling-your-objects-1766001(在幻灯片 #35 附近)以获得实用的解决方案。

总结: dbtable 模块和你的代码应该总是关于使用 db.

于 2010-10-10T10:41:27.537 回答
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 从数据库中获取数据并将其存储在缓存中......下次您不需要从 db 获取数据。您可以轻松快速地从缓存中访问该数据。

于 2013-12-27T06:38:04.293 回答