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