当我使用Zend_Cache缓存Zend_Navigation时,它的页面层次结构变得混乱,这让我遇到了麻烦。
背景:我有大约50页和大约300个产品存储在数据库中。我查询数据库并创建一个数组以提供给Zend_Navigation。
缓存是
$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/' )
);这个很好用
$struct = $cache->load('Zend_Navigation');
if (empty($struct))
{
$cache->save($struct = self::getSiteStructure() );
}
return new Zend_Navigation( $struct );然后这个就被打乱了
$struct = $cache->load('Zend_Navigation');
if (empty($struct))
{
$cache->save($struct = new Zend_Navigation( self::getSiteStructure() );
}
return $struct;如果不从缓存中拉出导航,则导航工作正常。是的,显而易见的解决方案不是缓存Zend_Navigation,但构造函数做了大量工作来构建其内部表示:尽可能多地进行预计算缓存是有意义的……
我仍在尝试查看混乱的结果中是否存在某种模式。树中没有循环/循环。
发布于 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框架的开发人员已经找到了实现相同目标的其他方法。
发布于 2012-02-23 20:32:51
只是关于缓存页面数组的一个警告...
如果您缓存来自toArray()的数组,并且只想使用setPages($pagesFromCache),则需要停用缓存数组中的所有页面以供将来使用。
请小心,Zend_Navigation_Page_Mvc::isActive()会检查当前请求。这意味着当前MVC页面的isActive()仍然返回真正的,即使你调用了setActive(false)。
我发现停用所有页面的唯一方法是递归遍历结果数组:
$pages = $navigation->toArray();
array_walk_recursive(
$pages,
function(&$item, $key)
{
if($key === 'active')
$item = false;
}
);
$cache->save($pages, 'pages');发布于 2010-09-22 18:55:30
感谢您的帖子;我认为在组合Zend_Navigation和Zend_Cache时可能会出现问题,但我已经能够在普通的Zend_Navigation对象上使用保存方法,然后从缓存中检索该对象,而不需要使用toArray()。
X体验:我同意,随着导航对象大小的增长,它可能会变得相当笨拙;尽管我必须更深入地研究代码才能完成对大小临界点的理解。
https://stackoverflow.com/questions/1370130
复制相似问题