2010-10-10 6 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, который сделает ваше предложение трудно управлять.

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

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

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

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

+0

Спасибо за ваш ответ, прочитав слайд, я думаю, что декораторы сделают трюк, так как я иногда обходит контроллеры только при доступе к модели в представлениях, и мне не хотелось бы реализовывать мой кеш там, но декодированный объект нормально, поскольку кэширование не выполняется в представлениях и/или контроллерах. – John

+0

@ Джон: удачи! Я не уверен, что соглашаюсь с вызовами моделей в представлениях, но пока вы чувствуете себя комфортно с ним. :) (Мое мнение о взглядах заключается в том, что они должны быть немыми и просто принимать любые данные, которые бросаются на тему, т.е. они не должны знать ни о чем, кроме простейших методов ваших моделей). – chelmertz

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

Смежные вопросы