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.
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());
}
}
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();
}
}
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>
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"}}
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 .
la source
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.
la source