정적 블록 FPC 홀 펀치


16

정적 블록 (cms 블록) 용 FPC 홀 펀치를 만드는 가장 쉬운 방법은 무엇입니까?

내부에 다른 블록을 호출하는 정적 블록이 있다고 가정 해 보겠습니다. 페이지 블록마다 동적으로 동작하려는 동작이 있습니다.

답변:


10

Magento Enterprise의 전체 페이지 캐싱 모듈에서 CMS 블록을 홀 펀치하는 가장 쉬운 방법에는 몇 가지 단계가 있습니다.

먼저 필요한 디렉토리 구조를 살펴 보자.

BranchLabs/CacheBuster/
    Block/Cms.php         # We inherit almost all functions from the Mage CMS
                            block, only overriding the "getCacheKeyInfo" function.
                            We do this to set the CMS block ID for later use by
                            our placeholder model.
    etc/cache.xml         # Here we target our module's version of the CMS block
                            and set their cache lifetimes to 0.
    Model/Placeholder.php # This module is responsible for freshly rendering our
                            CMS blocks every time they're requested.

하향식 이해를 염두에두고 여기에 해당 파일을 채우는 방법이 있습니다.

  1. 내장 된 Magento CMS 블록을 확장하는 고유 한 블록 클래스를 만듭니다. 다음과 같이 "getCacheKeyInfo"함수를 재정의해야합니다.

    <?php
    // BranchLabs/CacheBuster/Block/Cms.php
    class BranchLabs_CacheBuster_Block_Cms extends Mage_Cms_Block_Block {
    
        // Used to set the cache placeholder attribute definitions, required in
        // the placeholder's "_renderBlock" function.
        public function getCacheKeyInfo() {
            return array('block_id' => $this->getBlockId());
        }
    
    }
  2. 캐시를 적용하지 않고 CMS 블록을 렌더링하는 자리 표시 자 모델을 설정하십시오.

    <?php
    // BranchLabs/CacheBuster/Model/Placeholder.php
    class BranchLabs_CacheBuster_Model_Placeholder extends Enterprise_PageCache_Model_Container_Abstract {
    
        public function applyWithoutApp(&$content)
        {
            return false;
        }
    
        protected function _getCacheId()
        {
            $id = 'CACHEBUSTER_HOLEPUNCH_' . microtime() . '_' . rand(0,99);
            return $id;
        }
    
        /**
         * CacheBuster doesn't cache data! Do nothing.
         */
        protected function  _saveCache($data, $id, $tags = array(), $lifetime = null)
        {
            return $this;
        }
    
        /**
         * Render fresh block content.
         *
         * @return false|string
         */
        protected function _renderBlock()
        {
            $block = $this->_placeholder->getAttribute('block');
            $block = new $block;
            // Get the block_id attribute we originally set in our CMS block's
            // getCacheKeyInfo function.
            $block_id = $this->_placeholder->getAttribute('block_id');
            $block->setBlockId($block_id);
            $block->setLayout(Mage::app()->getLayout());
            return $block->toHtml();
        }
    }
  3. 새로 만든 CMS 블록을 대상으로하고 새로 만든 자리 표시자를 사용하여 렌더링하도록 cache.xml을 설정하십시오.

    <!-- BranchLabs/CacheBuster/etc/cache.xml -->
    <?xml version="1.0" encoding="UTF-8"?>
    <config>
      <placeholders>
        <arbitrary_unique_identifier>
          <block>cachebuster/cms</block>
          <placeholder>ARBITRARY_UNIQUE_IDENTIFIER</placeholder>
          <container>BranchLabs_CacheBuster_Model_Placeholder</container>
          <cache_lifetime>0</cache_lifetime>
        </arbitrary_unique_identifier>
      </placeholders>
    </config>
  4. CMS에서 캐시 외부에서 렌더링하려는 블록의 블록 유형을 새로 발행 된 CMS 방지 블록으로 바꿉니다. {{block type="cachebuster/cms" block_id="cacheproof"}}


감사합니다 Graham, 나는 그것을 시도하고 어떻게되었는지 알려줄 것입니다.
LDusan

이 문제가 @LDusan의 문제를 해결 했습니까?
Graham

아직 시도하지 않았다면 알려 드리겠습니다 :)
LDusan

Graham 나는 이것이 효과가 있다고 생각하지만 유일한 단점은 캐시하지 않으려면 기존 cms 블록 클래스를 변경해야하지만 좋은 해결책은 아닙니다. 감사.
LDusan

3

문제는 Magento 코어 팀이 정적 블록을 캐시하는 것을 잊어 버렸으며 개별적으로 캐시되지 않은 것은 구멍을 뚫을 수 없다는 것입니다.

따라서 해결책은 캐싱을 먼저 수정 하는 것입니다 .


1

실제로, 해결책은 캐싱 수행 방식을 변경하는 것입니다.

Lesti의 FPC는 내 기념품 에서이 일을하고 있으며 무료입니다. 그것은 여러 웹 사이트 지원이 부족하지만 하나의 웹 사이트에 완벽합니다. 동적 펀칭 해야하는 블록을 지정할 수 있습니다.

나는 또한 Amasty의 FPC를 시험해 보았습니다. 비용을 지불해야하며 CE에 대한 완벽한 캐싱 솔루션은 아니지만 잘 작동합니다. 블록 / 페이지 캐싱 또는 둘 다를 지정할 수 있습니다. 캐시 된 객체의 압축률을 설정하여 Db / Filesystem (느린) 또는 memcached에 저장할 수도 있습니다.

행운을 빌어 요.

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