首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Zend_Navigation缓存

Zend_Navigation缓存
EN

Stack Overflow用户
提问于 2009-09-02 21:08:10
回答 3查看 1.8K关注 0票数 1

当我使用Zend_Cache缓存Zend_Navigation时,它的页面层次结构变得混乱,这让我遇到了麻烦。

背景:我有大约50页和大约300个产品存储在数据库中。我查询数据库并创建一个数组以提供给Zend_Navigation。

缓存是

代码语言:javascript
复制
        $secondsBetweenRefreshes = APPLICATION_ENV == 'development' ? 30 : 300; 
        self::$cache = Zend_Cache::factory( 'Core', 'File',
                             array( 'automatic_serialization' => true,
                                    'lifetime' => $secondsBetweenRefreshes ),
                             array( 'cache_dir' => CACHE_PATH . 'nav/' )
                           );

这个很好用

代码语言:javascript
复制
    $struct = $cache->load('Zend_Navigation'); 
    if (empty($struct))
    {
        $cache->save($struct = self::getSiteStructure() );
    }
    return new Zend_Navigation( $struct );

然后这个就被打乱了

代码语言:javascript
复制
    $struct = $cache->load('Zend_Navigation'); 
    if (empty($struct))
    {
        $cache->save($struct = new Zend_Navigation( self::getSiteStructure() );
    }
    return $struct;

如果不从缓存中拉出导航,则导航工作正常。是的,显而易见的解决方案不是缓存Zend_Navigation,但构造函数做了大量工作来构建其内部表示:尽可能多地进行预计算缓存是有意义的……

我仍在尝试查看混乱的结果中是否存在某种模式。树中没有循环/循环。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-09-03 06:05:51

读完这个问题后,我快速浏览了一下Zend_Navigation代码,似乎使用序列化缓存它不应该有任何固有的问题。但是,查看Zend_Navigation文档时,我发现了以下内容:

toArray()方法将容器和其中的页面转换为数组。这对于序列化和调试很有用。- Zend Navigation Containers: Other

您可能希望创建Zend_Navigation对象,使用toArray()函数创建数组并对其进行缓存。从数组重新创建页面应该是相当便宜的,尽管您可能想要做一些测试。

此外,如果可能的话,向Zend Framework维护者提交一份bug报告,以便他们可以查看一下。

Zend_Navigation虽然是一个有趣的组件,而且可以说是一个有用的组件,但我并不经常使用它。对于大型网站来说,将10,000+对象放在内存中并不是一个明智的想法,而且在Zend_Navigation中实现某些项目的方式会使其变得缓慢和笨拙。许多使用Zend框架的开发人员已经找到了实现相同目标的其他方法。

票数 1
EN

Stack Overflow用户

发布于 2012-02-23 20:32:51

只是关于缓存页面数组的一个警告...

如果您缓存来自toArray()的数组,并且只想使用setPages($pagesFromCache),则需要停用缓存数组中的所有页面以供将来使用。

请小心,Zend_Navigation_Page_Mvc::isActive()会检查当前请求。这意味着当前MVC页面isActive()仍然返回真正的,即使你调用了setActive(false)

我发现停用所有页面的唯一方法是递归遍历结果数组:

代码语言:javascript
复制
$pages = $navigation->toArray();

array_walk_recursive(
    $pages,
    function(&$item, $key)
    {
        if($key === 'active')
            $item = false;
    }
);

$cache->save($pages, 'pages');
票数 1
EN

Stack Overflow用户

发布于 2010-09-22 18:55:30

感谢您的帖子;我认为在组合Zend_Navigation和Zend_Cache时可能会出现问题,但我已经能够在普通的Zend_Navigation对象上使用保存方法,然后从缓存中检索该对象,而不需要使用toArray()

X体验:我同意,随着导航对象大小的增长,它可能会变得相当笨拙;尽管我必须更深入地研究代码才能完成对大小临界点的理解。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1370130

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档