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>

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にアップグレードした後、この問題が発生し始めました。

システムで他に何が起こっているのかを知らずに何が悪いのかを言うのはかなり難しいことを理解していますが、アイデアが不足しているので、誰かが少なくとももう少し方向性を与えることができることを願っています。

更新:

私もウィジェットでこれを試しました、例えば

<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つのウィジェットはすべて同じコンテンツを保持しています。


ウィジェット用に解決できましたか?
セルゲイグク

何ので、私は実際にその問題を持っていませんでしたが、Mage_Cms_Block_Widget_Blockは同じ問題ので、同じソリューションを持っている可能性があるように見えます
アンドリューケット

回答:


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をリクエストしてください。

2つのファイルを更新します

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

ライブシステムに適用する前に、ステージング環境でこれをテストしてください!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.