Dziurkacz blokowy FPC

16

Jaki byłby najłatwiejszy sposób na utworzenie dziurkacza FPC dla bloku statycznego (blok cms)?

Powiedzmy, że mam blok statyczny, który wywołuje inny blok wewnątrz, który ma zachowanie Chcę być dynamiczny przy każdym ładowaniu strony.

LDusan
źródło

Odpowiedzi:

10

Najłatwiejszy sposób, w jaki udało mi się otworzyć bloki CMS w module Full Page Caching Magento Enterprise, składa się z kilku kroków:

Najpierw spójrzmy na wymaganą strukturę katalogów:

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.

Mając na uwadze to odgórne zrozumienie, oto jak wypełnić te pliki.

  1. Utwórz własną klasę bloków, która rozszerza wbudowany blok Magento CMS. Musisz również zastąpić funkcję „getCacheKeyInfo” w następujący sposób:

    <?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. Skonfiguruj model zastępczy odpowiedzialny za renderowanie naszego bloku CMS bez stosowania pamięci podręcznej.

    <?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. Skonfiguruj plik cache.xml, aby celować w nasz nowo utworzony blok CMS i renderować za pomocą naszego nowo utworzonego symbolu zastępczego.

    <!-- 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. W CMS zamień typy bloków dla bloków, które próbujesz wyrenderować poza pamięcią podręczną, na nasz nowy, odporny na blok CMS blok: {{block type="cachebuster/cms" block_id="cacheproof"}}

Graham
źródło
Dzięki Graham, spróbuję i dam znać, jak poszło.
LDusan
Czy to rozwiązało twój problem dla ciebie @LDusan?
Graham
Jeszcze tego nie próbowałem, dam ci znać :)
LDusan
Graham Myślę, że to działa, jedyną wadą jest to, że musisz zmienić istniejące klasy bloków cms, jeśli nie chcesz, aby były buforowane, ale bez względu na to, że jest to dobre rozwiązanie. Dzięki.
LDusan
3

Problem polega na tym, że zespół podstawowy Magento zapomniał buforować statyczne bloki, a tego, co nie jest buforowane indywidualnie, nie można wykrawać.

Rozwiązaniem jest najpierw poprawienie buforowania .

użytkownik487772
źródło
1

Rzeczywiście rozwiązaniem byłoby zmienić sposób buforowania.

FPC Lesti robi to dobrze w mojej pamiątce, i to za darmo. Brakuje tylko obsługi wielu witryn, ale jest idealny dla 1 witryny i możesz określić bloki, które muszą być dynamicznie dziurkowane.

Próbowałem też FPC Amasty, będziesz musiał za to zapłacić i chyba nie jest to idealne rozwiązanie buforowania dla CE, ale działa dobrze, możesz określić buforowanie bloków / stron lub obu. Możesz także ustawić stopień kompresji buforowanych obiektów i przechowywać je w Db / System plików (wolny) lub memcached.

Życzę powodzenia.

Sorcy
źródło