Antworten:
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.
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());
}
}
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();
}
}
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>
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"}}
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 .
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.