Perfurador de bloco estático FPC

16

Qual seria a maneira mais fácil de criar um furador FPC para bloco estático (bloco cms)?

Digamos que eu tenha um bloco estático que chame outro bloco dentro que tenha um comportamento que eu quero ser dinâmico em cada carregamento de página.

LDusan
fonte

Respostas:

10

A maneira mais fácil que encontrei para perfurar blocos de CMS no módulo de cache de página inteira do Magento Enterprise tem algumas etapas:

Primeiro, vejamos a estrutura de diretórios necessária:

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.

Com esse entendimento de cima para baixo em mente, veja como preencher esses arquivos.

  1. Crie sua própria classe de bloco que estende o bloco Magento CMS embutido. Você precisará substituir a função "getCacheKeyInfo" da seguinte forma:

    <?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. Configure o modelo de espaço reservado que é responsável por renderizar nosso bloco CMS sem aplicar o cache.

    <?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. Configure cache.xml para segmentar nosso bloco CMS recém-criado e renderizar usando nosso espaço reservado recém-criado.

    <!-- 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. No CMS, substitua os tipos de bloco pelos blocos que você está tentando renderizar fora do cache pelo nosso novo bloco à prova de CMS: {{block type="cachebuster/cms" block_id="cacheproof"}}

Graham
fonte
Obrigado Graham, vou tentar e informar como foi.
LDusan 12/09
Isso resolveu o seu problema para você @LDusan?
Graham
Não tente isso ainda, eu vou deixar você sabe :)
LDusan
Graham Eu acho que isso funciona, a única desvantagem é que você teria que alterar as classes de bloco cms existentes se não quiser que elas sejam armazenadas em cache, mas, independentemente disso, é uma boa solução. Obrigado.
LDusan
3

O problema é que a equipe principal do Magento esqueceu de armazenar em cache os blocos estáticos e o que não é armazenado em cache individualmente não pode ser perfurado.

Portanto, a solução é corrigir o cache primeiro .

user487772
fonte
1

De fato, a solução seria alterar a maneira como o cache é feito.

O FPC de Lesti está fazendo isso certo na minha lembrança, e é grátis. Falta apenas o suporte a vários sites, mas é perfeito para 1 site e você poderá especificar os blocos que devem ser dinamicamente perfurados.

Eu também tentei o FPC da Amasty, você terá que pagar por isso e não é a solução de cache perfeita para o CE, eu acho, mas está funcionando bem, você pode especificar o cache de blocos / páginas ou ambos. Você também pode definir a taxa de compactação dos objetos em cache e armazená-los no Db / Filesystem (lento) ou no memcached.

Te desejo boa sorte.

Sorcy
fonte