Static Block FPC Locher

16

Was wäre der einfachste Weg, um einen FPC-Locher für einen statischen Block (cms-Block) zu erstellen?

Angenommen, ich habe einen statischen Block, der einen anderen Block aufruft, dessen Verhalten ich bei jedem Laden der Seite dynamisch sein möchte.

LDusan
quelle

Antworten:

10

Der einfachste Weg, CMS-Blöcke im Magento Enterprise Full Page Caching-Modul zu lochen, sind einige Schritte:

Schauen wir uns zunächst die erforderliche Verzeichnisstruktur an:

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.

In Anbetracht dieses Top-Down-Verständnisses erfahren Sie hier, wie Sie diese Dateien ausfüllen.

  1. Erstellen Sie Ihre eigene Blockklasse, die den integrierten Magento CMS-Block erweitert. Sie müssen die Funktion "getCacheKeyInfo" auch wie folgt überschreiben:

    <?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. Richten Sie das Platzhaltermodell ein, das für das Rendern unseres CMS-Blocks verantwortlich ist, ohne den Cache anzuwenden.

    <?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. Richten Sie cache.xml so ein, dass es auf unseren neu erstellten CMS-Block abzielt und mit unserem neu erstellten Platzhalter gerendert wird.

    <!-- 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. Ersetzen Sie im CMS die Blocktypen für die Blöcke, die Sie außerhalb des Caches rendern möchten, durch unseren neu gestalteten CMS-sicheren Block: {{block type="cachebuster/cms" block_id="cacheproof"}}

Graham
quelle
Danke Graham, ich werde es versuchen und dich wissen lassen, wie es gelaufen ist.
LDusan
Hat dies Ihr Problem für Sie @LDusan gelöst?
Graham
Hab
Graham Ich denke, das funktioniert, der einzige Nachteil ist, dass Sie die vorhandenen cms-Blockklassen ändern müssen, wenn Sie möchten, dass sie nicht zwischengespeichert werden, aber es ist trotzdem eine gute Lösung. Vielen Dank.
LDusan
3

Das Problem ist, dass das Magento-Kernteam vergessen hat, statische Blöcke zwischenzuspeichern, und was nicht einzeln zwischengespeichert wird, kann nicht durchlöchert werden.

Die Lösung besteht also darin, zuerst das Caching zu beheben .

user487772
quelle
1

In der Tat wäre die Lösung, die Art und Weise zu ändern, wie das Caching durchgeführt wird.

Lestis FPC macht das in meinem Souvenir richtig und es ist kostenlos. Es fehlt nur die Unterstützung für mehrere Websites, aber es ist perfekt für 1 Website und Sie können die Blöcke angeben, die dynamisch gelocht werden müssen.

Ich habe auch Amastys FPC ausprobiert, Sie müssen dafür bezahlen und es ist vermutlich nicht die perfekte Caching-Lösung für CE, aber es funktioniert gut, Sie können das Cachen von Blöcken / Seiten oder beidem festlegen. Sie können auch die Komprimierungsrate der zwischengespeicherten Objekte festlegen und diese in Db / Filesystem (langsam) oder im Speicher ablegen.

Wünsch dir Glück.

Sorcy
quelle