我有一个似乎与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>
.

在第二个例子中,您可以看到前两个PROMOS是正确的,但是之后的一切都在显示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后,此问题已开始发生。

我很难说出错误的情况下,不知道系统中还有什么,但我希望有人可能能够在这里至少在这里给我一些方向,因为我没有想到的想法。

更新:

我也用小部件尝试了这个,例如,

<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个块也返回相同的内容。当缓存被清除时,返回的块有时会更改,但所有三个小部件仍将具有相同的内容。

有帮助吗?

解决方案

好的,所以我发现了这个问题的原因,似乎是核心玛托的问题。

在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

其他提示

对于Magento EE客户,请从Magento Enterprise支持团队申请补丁Supee-5874。

它将更新两个文件

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

我无法从magento发布实际的修补程序,因为它是他们的财产。

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

创建此扩展以便更好地缓存静态块。它还考虑了网站是否得到保护。延期也没有任何核心重写,这使得该模块更好。

在这里你go

更好地概述扩展,您可以 参考此帖子

我们为CE提供了一个补丁,解决了这个问题。由于EE基于CE,因此可能适用。

您可以从My Gist下载此路径: https://gist.github.com/tux-RAMPAGE / 77B286F7973336877F7B

向下加载GIST,解压缩它,并在Magento Root中运行以下命令:

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

在将它应用于实时系统之前在暂存环境中进行测试!

许可以下: CC-BY-SA归因
scroll top