Jaki byłby najłatwiejszy sposób na utworzenie dziurkacza FPC dla bloku statycznego (blok cms)?
Powiedzmy, że mam blok statyczny, który wywołuje inny blok wewnątrz, który ma zachowanie Chcę być dynamiczny przy każdym ładowaniu strony.
źródło
Jaki byłby najłatwiejszy sposób na utworzenie dziurkacza FPC dla bloku statycznego (blok cms)?
Powiedzmy, że mam blok statyczny, który wywołuje inny blok wewnątrz, który ma zachowanie Chcę być dynamiczny przy każdym ładowaniu strony.
Najłatwiejszy sposób, w jaki udało mi się otworzyć bloki CMS w module Full Page Caching Magento Enterprise, składa się z kilku kroków:
Najpierw spójrzmy na wymaganą strukturę katalogów:
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.
Mając na uwadze to odgórne zrozumienie, oto jak wypełnić te pliki.
Utwórz własną klasę bloków, która rozszerza wbudowany blok Magento CMS. Musisz również zastąpić funkcję „getCacheKeyInfo” w następujący sposób:
<?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());
}
}
Skonfiguruj model zastępczy odpowiedzialny za renderowanie naszego bloku CMS bez stosowania pamięci podręcznej.
<?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();
}
}
Skonfiguruj plik cache.xml, aby celować w nasz nowo utworzony blok CMS i renderować za pomocą naszego nowo utworzonego symbolu zastępczego.
<!-- 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>
W CMS zamień typy bloków dla bloków, które próbujesz wyrenderować poza pamięcią podręczną, na nasz nowy, odporny na blok CMS blok: {{block type="cachebuster/cms" block_id="cacheproof"}}
Problem polega na tym, że zespół podstawowy Magento zapomniał buforować statyczne bloki, a tego, co nie jest buforowane indywidualnie, nie można wykrawać.
Rozwiązaniem jest najpierw poprawienie buforowania .
źródło
Rzeczywiście rozwiązaniem byłoby zmienić sposób buforowania.
FPC Lesti robi to dobrze w mojej pamiątce, i to za darmo. Brakuje tylko obsługi wielu witryn, ale jest idealny dla 1 witryny i możesz określić bloki, które muszą być dynamicznie dziurkowane.
Próbowałem też FPC Amasty, będziesz musiał za to zapłacić i chyba nie jest to idealne rozwiązanie buforowania dla CE, ale działa dobrze, możesz określić buforowanie bloków / stron lub obu. Możesz także ustawić stopień kompresji buforowanych obiektów i przechowywać je w Db / System plików (wolny) lub memcached.
Życzę powodzenia.
źródło