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로 업그레이드 한 후에이 문제가 발생하기 시작했습니다.

나는 시스템에서 무슨 일이 일어나고 있는지 알지 못하고 무엇이 잘못되었는지 말하기가 어렵다는 것을 알고 있지만 아이디어가 없어지면 누군가가 여기에 더 많은 지시를 줄 수 있기를 바랍니다.

최신 정보:

나는 또한 위젯으로 이것을 시도했다.

<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 개의 블록 모두 동일한 내용을 반환했습니다. 캐시가 지워지면 반환 된 블록이 때때로 변경되지만 세 위젯 모두 여전히 동일한 내용을 갖습니다.


위젯으로 해결할 수 있었습니까?
Sergei Guk

사실 그래서 그 문제가되지 않았지만, Mage_Cms_Block_Widget_Block 같은 문제 때문에 동일한 솔루션있을 것 같습니다
앤드류 Kett

답변:


5

좋아, 그래서이 문제의 원인을 발견했으며 핵심 마 젠토에 문제가있는 것 같습니다.

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 파일을 사용하여 블록을 추가하지 않고 이름이 설정되어 있지 않습니다. 마 젠토는 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 Enterprise 지원 팀에 패치 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

실제 시스템에 적용하기 전에 준비 환경에서이를 테스트하십시오!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.