Perforatore statico FPC


16

Quale sarebbe il modo più semplice per creare un perforatore FPC per blocco statico (blocco cms)?

Diciamo che ho un blocco statico che chiama un altro blocco all'interno che ha un comportamento che voglio essere dinamico ad ogni caricamento della pagina.

Risposte:


10

Il modo più semplice che ho trovato per eseguire il holepunch dei blocchi CMS nel modulo di memorizzazione nella cache a pagina intera di Magento Enterprise prevede alcuni passaggi:

Innanzitutto, diamo un'occhiata alla struttura di directory richiesta:

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 questa comprensione dall'alto in basso ecco come compilare quei file.

  1. Crea la tua classe di blocco che estende il blocco CMS Magento integrato. Dovrai sovrascrivere anche la funzione "getCacheKeyInfo" come segue:

    <?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. Imposta il modello segnaposto che è responsabile del rendering del nostro blocco CMS senza applicare la 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. Imposta cache.xml per indirizzare il nostro blocco CMS appena creato e renderizzarlo usando il nostro segnaposto appena creato.

    <!-- 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. Nel CMS, sostituisci i tipi di blocco per i blocchi che stai provando eseguono il rendering all'esterno della cache con il nostro blocco a prova di CMS appena coniato: {{block type="cachebuster/cms" block_id="cacheproof"}}


Grazie Graham, ci proverò e ti farò sapere come è andata.
LDusan,

Questo ha risolto il tuo problema per te @LDusan?
Graham,

Non l'ho ancora provato, ti farò sapere :)
LDusan,

Graham Penso che funzioni, l'unico inconveniente è che dovresti cambiare le classi di blocchi cms esistenti se non le vuoi memorizzare nella cache, ma a prescindere è una buona soluzione. Grazie.
LDusan,

3

Il problema è che il core team di Magento ha dimenticato di memorizzare nella cache blocchi statici e ciò che non viene memorizzato nella cache individualmente non può essere perforato.

Quindi la soluzione è risolvere innanzitutto la cache .


1

In effetti, la soluzione sarebbe quella di cambiare il modo in cui viene eseguita la memorizzazione nella cache.

L'FPC di Lesti lo sta facendo nel mio souvenir ed è gratuito. Manca solo il supporto di più siti Web, ma è perfetto per 1 sito Web e sarai in grado di specificare i blocchi che devono essere perforati dinamicamente.

Ho anche provato l'FPC di Amasty, dovrai pagare per questo e non è la soluzione di memorizzazione nella cache perfetta per CE immagino, ma funziona bene, puoi specificare la memorizzazione nella cache di blocchi / pagine o entrambi. È inoltre possibile impostare il tasso di compressione degli oggetti memorizzati nella cache e memorizzarli in Db / Filesystem (lento) o memcached.

Ti auguro buona fortuna.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.