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のキャッシュモジュールとdbモジュールを結合しているため、キャッシュメカニズムを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 に答える