Я пытаюсь реализовать кеш в 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;
}
}