Perforateur de bloc statique FPC


16

Quelle serait la façon la plus simple de créer un perforateur FPC pour un bloc statique (bloc cms)?

Disons que j'ai un bloc statique qui appelle un autre bloc à l'intérieur qui a un comportement que je veux être dynamique à chaque chargement de page.

Réponses:


10

La manière la plus simple que j'ai trouvée pour holepunch CMS blocs dans le module de mise en cache de page complète de Magento Enterprise a quelques étapes:

Tout d'abord, regardons la structure de répertoires requise:

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.

Avec cette compréhension descendante à l'esprit, voici comment remplir ces fichiers.

  1. Créez votre propre classe de blocs qui étend le bloc CMS Magento intégré. Vous devrez également remplacer la fonction "getCacheKeyInfo" comme suit:

    <?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. Configurez le modèle d'espace réservé qui est responsable du rendu de notre bloc CMS sans appliquer le 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. Configurez cache.xml pour cibler notre bloc CMS nouvellement créé et effectuer le rendu à l'aide de notre espace réservé nouvellement créé.

    <!-- 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. Dans le CMS, remplacez les types de blocs pour les blocs que vous essayez de rendre en dehors du cache par notre nouveau bloc résistant au CMS: {{block type="cachebuster/cms" block_id="cacheproof"}}


Merci Graham, je vais essayer et vous faire savoir comment ça s'est passé.
LDusan

Est-ce que cela a résolu votre problème pour vous @LDusan?
Graham

Je ne l'ai pas encore essayé, je vous le ferai savoir :)
LDusan

Graham, je pense que cela fonctionne, le seul inconvénient est que vous auriez à changer les classes de blocs cms existantes si vous voulez qu'elles ne soient pas mises en cache, mais quelle que soit la bonne solution. Merci.
LDusan

3

Le problème est que l'équipe principale de Magento a oublié de mettre en cache les blocs statiques et ce qui n'est pas mis en cache individuellement ne peut pas être perforé.

La solution consiste donc à corriger d'abord la mise en cache .


1

En effet, la solution serait de changer la façon dont la mise en cache est effectuée.

Le FPC de Lesti le fait bien dans mon souvenir, et c'est gratuit. Il ne manque que la prise en charge de plusieurs sites Web, mais il est parfait pour 1 site Web et vous pourrez spécifier les blocs qui doivent être perforés dynamiquement.

J'ai également essayé le FPC d'Amasty, vous devrez payer et ce n'est pas la solution de mise en cache parfaite pour CE, je suppose, mais cela fonctionne bien, vous pouvez spécifier la mise en cache des blocs / pages ou les deux. Vous pouvez également définir le taux de compression des objets mis en cache et les stocker dans Db / Filesystem (lent) ou memcached.

Je te souhaite bonne chance.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.