Jawaban:
Cara termudah yang saya temukan untuk memasang blok CMS dalam modul Caching Halaman Penuh Magento Enterprise memiliki beberapa langkah:
Pertama, mari kita lihat struktur direktori yang diperlukan:
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.
Dengan pemahaman top-down itu, inilah cara mengisi file-file itu.
Buat kelas blok Anda sendiri yang memperluas blok Magento CMS bawaan. Anda harus mengganti fungsi "getCacheKeyInfo" sebagai berikut juga:
<?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());
}
}
Siapkan model placeholder yang bertanggung jawab untuk mengeluarkan blok CMS kami tanpa menerapkan 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();
}
}
Siapkan cache.xml untuk menargetkan blok CMS kami yang baru dibuat dan render menggunakan placeholder kami yang baru dibuat.
<!-- 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>
Di CMS, ganti jenis blok untuk blok yang Anda coba render di luar cache dengan blok bukti CMS kami yang baru dicetak: {{block type="cachebuster/cms" block_id="cacheproof"}}
Masalahnya adalah bahwa tim inti Magento lupa untuk men-cache blok statis dan apa yang tidak di-cache secara individual tidak dapat dilubangi.
Jadi solusinya adalah memperbaiki caching terlebih dahulu .
Memang, solusinya adalah mengubah cara caching dilakukan.
FPC Lesti melakukan ini dengan benar di suvenir saya, dan gratis. Itu hanya tidak memiliki dukungan beberapa situs web, tetapi itu sempurna untuk 1 situs web dan Anda akan dapat menentukan blok yang harus secara dinamis dilubangi.
Saya juga mencoba FPC Amasty, Anda harus membayar untuk itu dan itu bukan solusi caching yang sempurna untuk CE, saya kira, tetapi ini bekerja dengan baik, Anda dapat menentukan caching blok / halaman atau keduanya. Anda juga dapat mengatur tingkat kompresi objek yang di-cache dan menyimpannya di Db / Filesystem (lambat) atau memcached.
Semoga beruntung.