EE 1.14.2中的CMS块缓存问题


15

我有一个问题似乎与CMS静态块的缓存有关。

我有一个cms页面,在该页面中,我正在渲染许多cms静态块。CMS页面内容的简化版本如下所示:

<div class="cms-block-1">{{block type="cms/block" block_id="banner_home"}}</div> 
<div class="cms-block-2">{{block type="cms/block" block_id="promo_home_1_1"}}</div> 
<div class="cms-block-3">{{block type="cms/block" block_id="promo_home_1_2"}}</div> 
<div class="cms-block-4">{{block type="cms/block" block_id="promo_home_2_1"}}</div> 
<div class="cms-block-5">{{block type="cms/block" block_id="promo_home_2_2"}}</div> 
<div class="cms-block-6">{{block type="cms/block" block_id="promo_home_2_3"}}</div> 
<div class="cms-block-7">{{block type="cms/block" block_id="promo_home_3_1"}}</div> 
<div class="cms-block-8">{{block type="cms/block" block_id="promo_home_3_2"}}</div>

该页面将在清除块缓存后立即按预期加载,该页面如下所示:

<div class="cms-block-1">banner content</div> 
<div class="cms-block-2">promo_home_1_1 content</div> 
<div class="cms-block-3">promo_home_1_2 content</div> 
<div class="cms-block-4">promo_home_2_1 content</div> 
<div class="cms-block-5">promo_home_2_2 content</div> 
<div class="cms-block-6">promo_home_2_3 content</div> 
<div class="cms-block-7">promo_home_3_1 content</div> 
<div class="cms-block-8">promo_home_3_1 content</div>

但是,在初始页面加载之后,每个后续页面加载的内容都不正确。看起来像这样:

<div class="cms-block-1">banner content</div> 
<div class="cms-block-2">promo_home_1_1 content</div> 
<div class="cms-block-3">promo_home_1_2 content</div> 
<div class="cms-block-4">promo_home_1_1 content</div> 
<div class="cms-block-5">promo_home_1_2 content</div> 
<div class="cms-block-6">promo_home_2_1 content</div> 
<div class="cms-block-7">promo_home_2_2 content</div> 
<div class="cms-block-8">promo_home_2_3 content</div>

在第二个示例中,您可以看到前两个促销是正确的,但是此后的所有内容都显示的block_id内容错误。此外,块promo_home_1_1和promo_home_1_2均被渲染两次,而promo_home_3_1和promo_home_3_2则从不渲染。就像block_id及其关联的静态块内容之间的映射一样,它以某种方式被混淆了。这与缓存有关,好像没有启用块缓存,那么我再也看不到问题了。

另外,可能值得注意的是,该页面以前可以在EE 1.13上运行,但是在升级到EE 1.14.2之后,此问题开始出现。

在不知道系统中发生了什么其他情况的情况下,我很难说出问题出在哪里,但是我希望有人会在我心中out满时,至少可以给我一些指导。

更新:

我也尝试了小部件,例如

<div class="cms-block-1">{{widget type="cms/widget_block" template="cms/widget/static_block/default.phtml" block_id="63"}}</div>
<div class="cms-block-2">{{widget type="cms/widget_block" template="cms/widget/static_block/default.phtml" block_id="64"}}</div>
<div class="cms-block-3">{{widget type="cms/widget_block" template="cms/widget/static_block/default.phtml" block_id="65"}}</div>

在这种情况下,即使ID指向数据库中的不同块,所有3个块都返回相同的内容。清除缓存后,返回的块有时会更改,但是所有三个小部件仍将具有相同的内容。


您能够解决小部件的问题吗?
谢尔盖·古克

我实际上没有这个问题,所以没有,但是看起来Mage_Cms_Block_Widget_Block可能有相同的问题,因此也有相同的解决方案
Andrew

Answers:


5

好的,所以我已经找到了导致此问题的原因,并且似乎是核心magento的问题。

magento 1.14.2中的Mage_Cms_Block_Block中添加了一个新的_construct方法,该方法包含以下代码。

/**
 * Initialize cache
 *
 * @return null
 */
protected function _construct()
{
    /*
    * setting cache to save the cms block
    */
    $this->setCacheTags(array(Mage_Cms_Model_Block::CACHE_TAG));
    $this->setCacheLifetime(false);
}

这实际上为cms块启用了缓存。没有设置缓存键,因此它会退回到Mage_Core_Block_Abstract :: getCacheKeyInfo,它使用布局中块的名称。在这种情况下,我们实际上并没有使用布局xml文件来添加块,也没有设置名称。Magento似乎通过设置类似ANONYMOUS_78的名称来尝试解决这个问题。但是由于某种原因,这似乎无法100%正常工作,因此我看到的重复项。

我的解决方案是在我自己的扩展中重写Mage_Cms_Block_Block类,并添加一个新方法来将缓存键显式设置为块ID,而不是分配的值。该类如下所示:

/**
 * Override cms/block to add cache key. This started being a problem as of EE 1.14.2 when the _construct
 * method was added which turns on caching for cms blocks
 */
class Mysite_Cms_Block_Block extends Mage_Cms_Block_Block
{

    /**
     * If this block has a block id, use that as the cache key.
     *
     * @return array
     */
    public function getCacheKeyInfo()
    {
        if ($this->getBlockId()) {
            return array(
                Mage_Cms_Model_Block::CACHE_TAG,
                Mage::app()->getStore()->getId(),
                $this->getBlockId(),
                (int) Mage::app()->getStore()->isCurrentlySecure()
            );
        } else {
            return parent::getCacheKeyInfo();
        }
    }
}

这似乎已经解决了问题。

更新:

看来在CE 1.9.2中存在同样的问题


2

对于Magento EE客户,请从Magento企业支持团队索取补丁SUPEE-5874。

它将更新两个文件

app/code/core/Mage/Cms/Block/Widget/Block.php
app/code/core/Mage/Cms/Block/Block.php

我无法发布Magento的实际补丁,因为这是他们的财产。


1

令人高兴的是,Magento现在也正在缓存静态块。由于当前的升级版本由于缓存了静态块而包含了这个棘手的问题,因此您可以完全免费使用我的模块。

创建此扩展是为了更好地缓存静态块。它还考虑了站点是否安全。此外,该扩展没有任何核心重写,这使此模块更加出色。

干得好

为了更好地了解扩展,您可以参考该线程


0

我们提供了CE的补丁程序,可以解决此问题。由于EE基于CE,因此这也可能适用。

您可以从我的要点下载此路径:https : //gist.github.com/tux-rampage/77b286f7973336877f7b

下载要点,解压缩它,然后在您的magento根目录中运行以下命令:

patch -p2 </path/to/LUKA-MCE20150714-cms-caching-hotfix.patch

在暂存环境中进行测试,然后再将其应用于实时系统!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.