EE 1.14.2中的CMS块缓存问题
-
13-12-2019 - |
题
我有一个似乎与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发布实际的修补程序,因为它是他们的财产。
我们为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
.
在将它应用于实时系统之前在暂存环境中进行测试!