【问题标题】:Zend_db cachingZend_db 缓存
【发布时间】:2012-02-27 00:41:51
【问题描述】:

有没有办法在 Zend_db 中缓存结果集?例如,我想使用 Zend_db 运行一个选择查询,并希望缓存这个查询以便以后能够更快地运行它。

【问题讨论】:

    标签: zend-framework zend-db zend-cache


    【解决方案1】:

    我的建议是在 Bootstrap.php 中创建一个带有前缀“_init”的初始化方法。例如:

    /**
     * 
     * @return Zend_Cache_Manager 
     */
    public function _initCache()
    {
        $cacheManager = new Zend_Cache_Manager();
        $frontendOptions = array(
            'lifetime' => 7200, // cache lifetime of 2 hours
            'automatic_serialization' => true
        );
        $backendOptions = array(
            'cache_dir' => APPLICATION_PATH . '/cache/zend_cache'
        );
        $coreCache = Zend_Cache::factory(
                    'Core', 
                    'File', 
                    $frontendOptions, 
                    $backendOptions
                );
        $cacheManager->setCache('coreCache', $coreCache);
        $pageCache = Zend_Cache::factory(
                'Page', 
                'File', 
                $frontendOptions, 
                $backendOptions
        );
        $cacheManager->setCache('pageCache', $pageCache);
    
        Zend_Registry::set('cacheMan', $cacheManager);
        return $cacheManager;
    }
    

    通过这种方式,您已创建缓存管理器并将其注入应用中所需的缓存。 现在你可以在你想使用的地方使用这个缓存对象了。 例如,在您的控制器或其他地方:

    /**
     *
     * @return boolean |SimplePie
     */
    public function getDayPosts() 
    {
        $cacheManager =  Zend_Registry::get('cacheMan');
        $cache = $cacheManager->getCache('coreCache');
        $cacheID = 'getDayPosts';
    
        if (false === ($blog = $cache->load($cacheID))) {
            $blog = Blog::find(array('order' => 'rand()', 'limit' => 1));
            $cache->save($blog, $cacheID);
        }
        // do what you want to do with the daya you fetched.
    }
    

    【讨论】:

      【解决方案2】:

      当你想保存结果集时,你可以使用 Zend_Cache。

      Zend_Db 本身不做任何结果集缓存。留给您以特定于应用程序的方式进行操作,因为框架无法知道哪些结果集出于性能原因需要缓存,而那些无法因为您需要它们绝对是最新的。这些是只有您作为应用程序开发人员知道的标准。

      只需在谷歌上搜索“zend_db 缓存结果”,第一个匹配项就是这个博客,它展示了如何使用 Zend_Cache 对象来保存 db 查询结果:Zend Framework:: Caching the database query results

      【讨论】:

      • 保持控制器精简和干净的一种方法是将所有这些缓存业务推送到存储库对象中(设计为同时支持 db 和缓存)。
      • @David Weinraub 现在您知道您已经为我们这些新手定义了“存储库对象”。 :) 至少给我们一个链接。
      • 这可以扩展到对建模、映射器、数据库访问层、存储库、服务甚至依赖注入的更广泛的讨论。但我将存储库视为“似乎”保存我的数据的地方。通常,我的 repo 对象将 (1) 公开一个定义明确的接口来访问数据,以及 (2) 接受一个 db-adapter 和一个缓存对象作为构造函数参数。在内部,定义的接口中的每个数据访问方法在访问 db 之前首先检查缓存。然后控制器只与存储库对象交互。
      • @David Weinraub 谢谢,我想我明白了(至少有些)。在这种情况下,我会将数据缓存放在我执行查询或聚合它们的模型层中(取决于复杂性)。我意识到我很简单,但我还不是计算机软件工程师。
      • @RockyFord:更多阅读请查看我对Is MVC + Service Layer common in zend or PHP?Domain-Driven Design Quickly 的回复。
      猜你喜欢
      • 1970-01-01
      • 2012-07-03
      • 2011-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-10
      • 2011-06-20
      • 1970-01-01
      相关资源
      最近更新 更多