Perforadora de bloque estático FPC


16

¿Cuál sería la forma más fácil de crear un taladro FPC para el bloque estático (bloque cms)?

Digamos que tengo un bloque estático que llama a otro bloque dentro que tiene un comportamiento que quiero ser dinámico en cada carga de página.

Respuestas:


10

La forma más fácil que he encontrado para perforar bloques CMS en el módulo de almacenamiento en caché de página completa de Magento Enterprise tiene algunos pasos:

Primero, veamos la estructura de directorio requerida:

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.

Con esa comprensión de arriba hacia abajo en mente, he aquí cómo llenar esos archivos.

  1. Cree su propia clase de bloque que amplíe el bloque Magento CMS integrado. Deberá anular la función "getCacheKeyInfo" de la siguiente manera también:

    <?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 el modelo de marcador de posición responsable de representar nuestro bloque CMS sin aplicar el caché.

    <?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 apuntar a nuestro bloque CMS recién creado y renderizar utilizando nuestro marcador de posición recién creado.

    <!-- 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. En el CMS, reemplace los tipos de bloque para los bloques que está intentando renderizar fuera del caché con nuestro bloque a prueba de CMS recién creado: {{block type="cachebuster/cms" block_id="cacheproof"}}


Gracias Graham, lo intentaré y te diré cómo te fue.
LDusan

¿Esto resolvió tu problema para ti @LDusan?
Graham

No lo probamos sin embargo, yo lo haré saber :)
LDusan

Graham, creo que esto funciona, el único inconveniente es que tendrías que cambiar las clases de bloque cms existentes si no quieres que se almacenen en caché, pero independientemente de que sea una buena solución. Gracias.
LDusan


1

De hecho, la solución sería cambiar la forma en que se realiza el almacenamiento en caché.

El FPC de Lesti está haciendo esto en mi recuerdo, y es gratis. Solo carece de soporte para múltiples sitios web, pero es perfecto para 1 sitio web y podrá especificar los bloques que deben ser perforados dinámicamente.

También probé el FPC de Amasty, tendrás que pagarlo y no es la solución de almacenamiento en caché perfecta para CE, supongo, pero está funcionando bien, puedes especificar el almacenamiento en caché de bloques / páginas o ambos. También puede establecer la tasa de compresión de los objetos en caché y almacenarlos en Db / Filesystem (lento) o memcached.

Te deseo suerte.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.