无法阻止 Magento 缓存块

Posted

技术标签:

【中文标题】无法阻止 Magento 缓存块【英文标题】:Unable to prevent Magento from Caching a Block 【发布时间】:2012-02-27 03:52:00 【问题描述】:

我正在开发一个 Magento 1.6 站点,该站点在主页的 CMS“布局更新 XML”字段中有以下 xml:

<reference name="content">
   <block type="catalog/navigation" name="catalog.category.home" as="homecategory" template="catalog/category/homecategory.phtml" />
</reference>

由于模板显示随机类别,我想禁用此块的缓存。 为此,我尝试使用 getChildHtml('sub-block-template', false) 和以下内容:

(homecategory 的模板中有 $this->getChildHtml('random_categories', false)

<reference name="content">
    <block type="catalog/navigation" name="catalog.category.home" as="homecategory" useCache="false" template="catalog/category/homecategory.phtml">
        <block type="catalog/navigation" name="catalog.category.home.randcats" as="random_categories"  useCache="false" template="catalog/category/random.phtml" />
    </block>
</reference>

所以现在我被卡住了,想知道为什么我不能阻止缓存该块,尽管使用了 'false' 参数。

【问题讨论】:

您是否在管理面板 > 系统 > 缓存管理中禁用了 Magento 缓存? 您应该为您的块实现整页缓存打孔。请参阅本教程 this tutorial 和 this question on SO。 没有 'useCache="false"' 属性之类的东西。 是的,这对我来说是一次绝望的尝试。忘记从我粘贴的代码示例中删除它。 @Detzee:我需要在这个站点上进行缓存——这就是重点。但是我想让这个块不被缓存。我最终选择了默认的 2 小时缓存过期时间,这是该站点在主页上轮换类别的可接受解决方案。 【参考方案1】:

我遇到了同样的问题。我相信它必须与 type="catalog/navigation" 的块类型有关。我已经看到在其他类型的块上禁用缓存工作。这是针对此块类型和此问题的修复:

phtml 文件更改:确保第二个参数为假

echo $this->getChildHtml('topCategoriesList',false);

xml 文件更改: 将这些操作添加到块中

<block type="catalog/navigation" name="topCategoriesList" as="topCategoriesList"    template="catalog/navigation/categorylist.phtml">
   <action method="unsetData"><key>cache_lifetime</key></action>
   <action method="unsetData"><key>cache_tags</key></action>
</block>

【讨论】:

【参考方案2】:

您是否尝试过通过创建新的自定义块类型并重载缓存函数来强制它?扩展 Mage_Catalog_Block_Product_List_Random 类并创建一个空的伪构造函数:

protected function _construct() 

这将防止继承添加缓存标签、生命周期和其他元数据到块对象。然后,您也可以重载缓存键信息,使其不使用任何现有(或启用)的缓存块。例如:

public function getCacheKeyInfo()

    return array(
        'MY_CACHE_TAG',
        Mage::app()->getStore()->getId(),
        (int)Mage::app()->getStore()->isCurrentlySecure(),
        Mage::getDesign()->getPackageName(),
        Mage::getDesign()->getTheme('template')
    );

【讨论】:

谢谢,我试试。虽然我还在用消防水管喝水,但创建这个自定义块可能需要反复试验。 也许可以尝试查看inchoo.net/ecommerce/magento/magento-block-caching 看看是否对您有帮助? Jona,感谢您提供该文章的链接。我注意到它表明当$this-&gt;addData(array('cache_lifetime' =&gt; 'false')) 是这种情况时(这是Category/Navigation 的默认设置,这意味着缓存每2 小时(7200 秒)自动刷新一次。这足以满足我的要求,并且可能更好比出于性能原因没有缓存。

以上是关于无法阻止 Magento 缓存块的主要内容,如果未能解决你的问题,请参考以下文章

Magento Varnish 缓存块对登录用户可见

Magento EE 1.9 的缓存:我们应该使用整页缓存(带有打孔)和/或“经典”块缓存吗?

Magento 使用 varnish 进行整页缓存

无法在 magento 2.4.3 中查看类别下的产品

了解 Magento 块和块类型

如何强制 Magento 使用 APC 缓存