Статический блок FPC дырокол


Какой был бы самый простой способ создать перфоратор FPC для статического блока (блок cms)?

Допустим, у меня есть статический блок, который вызывает другой блок внутри, поведение которого я хочу быть динамичным при каждой загрузке страницы.

Author: LDusan, 2014-09-08

3 answers

Самый простой способ, который я нашел для запуска блоков CMS в модуле кэширования полной страницы Magento Enterprise, состоит из нескольких шагов:

Во-первых, давайте посмотрим на требуемую структуру каталогов:

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. Создайте свой собственный класс блоков, который расширяет встроенный блок CMS Magento. Вам также потребуется переопределить функцию "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. Настройка cache.xml чтобы настроить таргетинг на наш недавно созданный блок CMS и визуализировать его с помощью нашего недавно созданного заполнителя.

    <!-- 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"}}

 10
Author: Graham, 2014-09-11 02:14:14

Проблема в том, что основная команда Magento забыла кэшировать статические блоки, а то, что не кэшируется по отдельности, не может быть пробито.

Таким образом, решение состоит в том, чтобы сначала исправить кэширование.

 3
Author: user487772, 2014-09-09 13:53:41

Действительно, решением было бы изменить способ кэширования.

FPC Лести делает это прямо в моем сувенире, и это бесплатно. Ему не хватает только поддержки нескольких веб-сайтов, но он идеально подходит для 1 веб-сайта, и вы сможете указать блоки, которые должны быть динамически пробиты.

Я также попробовал FPC от Amasty, вам придется заплатить за это, и, я думаю, это не идеальное решение для кэширования CE, но оно работает хорошо, вы можете указать кэширование блоков/страниц или оба. Вы также можете установить степень сжатия кэшированных объектов и хранить их в Бд/файловой системе (медленно) или в памяти.

Желаю вам удачи.

 1
Author: Sorcy, 2014-09-09 13:52:29