我尝试缓存显示菜单的块(例如来自Cmssmart_megamenu的模块)。
之前的版本是:
<block type="megamenu/navigation" name="catalog.topnav.megamenu">
<action method="unsetData"><key>cache_lifetime</key></action>
<action method="unsetData"><key>cache_tags</key></action>
</block>
因此作者明确地禁用了缓存。 我删除了2 unsetData,并在Cmsmart_Megamenu_Block_Navigation类中添加了_construct()方法。
class Cmsmart_Megamenu_Block_Navigation extends Mage_Catalog_Block_Navigation
{
protected function _construct()
$this->addData(array(
'cache_lifetime' => 86400,
'cache_key' => "my_key_mega_menu",
'cache_tags' => array(Mage_Catalog_Model_Category::CACHE_TAG, Mage_Cms_Model_Block::CACHE_TAG)
));
听起来好像有效,我可以看到缓存文件:mage --- 8ea_MY_KEY_MEGA_MENU。 在var / cache中。 但是,它会在一分钟后从缓存中消失。实际上,一旦下一个cron开始(每隔mn安排一次)
我使用了Aoe-template_hint,我可以看到这个块的绿色框,这意味着它被缓存,生命周期也正确设置为86400,所以有什么不对?
这是我的第一次尝试,你觉得这里有什么不对? 是否有其他规则而不是文件的持续时间到期?也许与另一个块的隐藏链接会更快到期? 不到1百万的缓存是奇怪的......
注意:我在Windows或Linux上有同样的问题,有或没有Redis
感谢
答案 0 :(得分:2)
有一个原因可能是,如果您在自己parent::_construct()
的末尾实际执行了_construct
,则表示您没有向我们展示。
因为在我的Magento版本(1.9.22)中,我看到Magento正在做的_construct
Mage_Catalog_Block_Navigation
:
protected function _construct()
{
$this->addData(array('cache_lifetime' => false));
$this->addCacheTag(array(
Mage_Catalog_Model_Category::CACHE_TAG,
Mage_Core_Model_Store_Group::CACHE_TAG
));
}
因此,行$this->addData(array('cache_lifetime' => false));
将覆盖您的设置。
解决问题的方法是先parent::_construct()
然后添加自己的cache_lifetime
像这样:
protected function _construct(){
parent::_construct(); // that calls the parent, then you override the cache_lifetime
$this->addData(array(
'cache_lifetime' => 86400,
'cache_key' => "my_key_mega_menu",
'cache_tags' => array(Mage_Catalog_Model_Category::CACHE_TAG, Mage_Cms_Model_Block::CACHE_TAG)
));
// parent::_construct(); but if you have it there, it will cause issues because this will override your settings
}
另一条路径可能就是覆盖方法来获取有关缓存的信息,这些信息现在正在使用Varien_Object
的魔术吸气剂,并执行以下操作:
/* That is not even needed anymore
protected function _construct(){
$this->addData(array(
'cache_lifetime' => 86400,
'cache_key' => "my_key_mega_menu",
'cache_tags' => array(Mage_Catalog_Model_Category::CACHE_TAG, Mage_Cms_Model_Block::CACHE_TAG)
));
}*/
public function getCacheLifetime() {
return 86400;
}
public function getCacheKey() {
return 'my_key_mega_menu';
}
public function getCacheTags() {
return array(Mage_Catalog_Model_Category::CACHE_TAG, Mage_Cms_Model_Block::CACHE_TAG);
}
答案 1 :(得分:1)
我搜索了对清理缓存的方法的调用,我发现它是由于一个模块实际上是通过这样做明确删除了每个cron上的所有缓存块:
Mage::app()->getCacheInstance()->cleanType('block_html');
我删除了这条线,现在进展顺利! 该模块是async_index