Magento缓存 - 清除缓存的规则

时间:2016-02-09 19:37:40

标签: magento caching

我尝试缓存显示菜单的块(例如来自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

感谢

2 个答案:

答案 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