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>
.
しかしながら、Interal Pageのロード後、後続のページの読み込みコンテンツが正しくありません。それはこのように見えます:
<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>
.
2番目の例では、最初の2つのプロモーションが正しいことがわかりますが、その後のすべてがblock_idの間違ったコンテンツを表示しています。また、ブロックPROMO_HOME_1_1とPROMO_HOME_1_2の両方が2回レンダリングされ、PROMO_HOME_3_1とPROMO_HOME_3_2がレンダリングされません。それはblock_idとそれに関連する静的ブロックコンテンツの間のマッピングがどういうわけか混乱しているようなものです。これは、ブロックキャッシュが有効になっていないかのようにキャッシュに関連しています。これは、問題を見ていません。
また、このページがEE 1.13で作業するのに使用されていることはおそらくEE 1.14.2にアップグレードした後、この問題が発生し始めました。
私はシステムで他に何が起こっているのかわからないことを知らずに何が悪いと言うのはかなり難しいことを実感しますが、私はアイデアを使い果たしているように、誰かがここで少なくともいくつかの方向を与えることができるかもしれないことを願っています。
更新:
私はまたウィジェット、e. / pでこれを試してみました
.
<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つのブロックはすべて同じコンテンツを返しました。キャッシュがクリアされると、返されるブロックは変更されることがありますが、3つのウィジェットすべてには同じコンテンツがあります。
解決
OKだから私はこの問題の原因を見つけました、そしてそれはコアマゼントで問題のようです。
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_ABSRACT :: GetCacheKeyInfoに戻ります。この場合、実際にはレイアウトXMLファイルを使用してブロックを追加し、名前を設定しません。 Magentoは名前としてanonymous_78のようなものを設定することによってこれを扱うように見えます。しかし、何らかの理由でこれは100%働いていないようです。したがって、私が見ていた重複。
My Solutionは、MAGE_CMS_BLOCK_BLOCKクラスを自分の拡張子でオーバーライドし、割り当てられた値ではなくブロックIDにCacheキーを明示的に設定するための新しいメソッドを追加しました。クラスは次のようになります:
/**
* 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();
}
}
}
.
これは問題を解決したようです。
更新:
それはまたこの同じ問題のように見えます
他のヒント
Magento EEのお客様は、Magento Enterprise Support TeamからPatch Supe-5874を依頼してください。
2つのファイルを更新します
app/code/core/Mage/Cms/Block/Widget/Block.php
app/code/core/Mage/Cms/Block/Block.php
.
マゼントから実際のパッチを投稿することはできません。
CE用のパッチを提供しました。この問題を解決しました。EEはCEに基づいているので、これも適用されるかもしれません。
このパスを私のgistからダウンロードすることができます: https://gist.github.com/tux - ランパージ/ 77B286F7973336877F7B
gistをロードし、それを解凍して、Magentoルートで次のコマンドを実行します。
patch -p2 </path/to/LUKA-MCE20150714-cms-caching-hotfix.patch
.
ライブシステムに適用する前にステージング環境でこれをテストしてください。