我想在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;
}
}
答案 0 :(得分:3)
据我所知,zf create db-table <name>
将始终创建一个继承Zend_Db_Table_Abstract
的类,这会使您的提案难以管理。
此外,你正在耦合缓存和放大器。 ZF的数据库模块因此可以说在dbtable范围内放置缓存机制是不对的。例如:您不应该知道从哪里获取数据但仍然能够缓存它,因此该过程变为:
因此,虽然您的解决方案现在有意义,因为您只使用dbtable模型,但它可以放在更适合的层中。我会查看http://www.slideshare.net/weierophinney/playdoh-modelling-your-objects-1766001(在幻灯片#35附近)寻找实用的解决方案。
总结:dbtable模块和与之相关的代码应始终使用db。
答案 1 :(得分: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);
}
}
在bootstrap文件中定义缓存数组,然后使用zend DB从数据库中获取数据并将其存储在缓存中... 下次你不需要从db获取数据。您可以轻松快速地从缓存中访问该数据。