Где я должен реализовать кеш в Zend_Db? - PullRequest
3 голосов
/ 10 октября 2010

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

Ответы [ 2 ]

3 голосов
/ 27 декабря 2013
    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 получить данные из базы данных и сохранить их в кэше ... в следующий раз вам не нужно получать данные из базы данных.Вы можете легко и быстро получить доступ к этим данным из кэша.

3 голосов
/ 10 октября 2010

Насколько я знаю, zf create db-table <name> всегда будет создавать класс, наследующий Zend_Db_Table_Abstract, что затруднит управление вашим предложением.

Кроме того, вы соединяете модули cache & db в ZF, так что можно утверждать, что неправильно помещать механизмы кэширования в область действия dbtable. Например: вы не должны знать, откуда извлекаются данные, но при этом иметь возможность их кэшировать, поэтому процесс становится таким:

  1. проверить кеш данных, подать, если найден
  2. извлекать данные из X (может быть dbtable, также может быть Service, XML-файл, немного JSON и т. Д.)
  3. сохранять данные в кеше и обслуживать данные

Так что, хотя ваше решение имеет смысл сейчас, поскольку вы используете только модели dbtable, оно может быть помещено в более подходящий слой. Я бы проверил http://www.slideshare.net/weierophinney/playdoh-modelling-your-objects-1766001 (вокруг слайда № 35) для практического решения.

Резюме: модуль dbtable и ваш код, касающийся его, всегда должны использовать db.

...