Câu trả lời:
Cách dễ nhất mà tôi đã tìm thấy để chặn các khối CMS trong mô-đun Bộ đệm toàn trang của Magento Enterprise có một vài bước:
Đầu tiên, chúng ta hãy xem cấu trúc thư mục cần thiết:
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.
Với ý nghĩ từ trên xuống dưới đây, làm thế nào để điền vào các tệp đó.
Tạo lớp khối của riêng bạn mở rộng khối Magento CMS tích hợp. Bạn cũng cần ghi đè chức năng "getCacheKeyInfo" như sau:
<?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());
}
}
Thiết lập mô hình giữ chỗ chịu trách nhiệm hiển thị khối CMS của chúng tôi mà không áp dụng bộ đệm.
<?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();
}
}
Thiết lập cache.xml để nhắm mục tiêu khối CMS mới tạo của chúng tôi và kết xuất bằng trình giữ chỗ mới được tạo của chúng tôi.
<!-- 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>
Trong CMS, thay thế các loại khối cho các khối bạn đang thử kết xuất bên ngoài bộ đệm bằng khối chứng minh CMS mới được tạo ra của chúng tôi: {{block type="cachebuster/cms" block_id="cacheproof"}}
Vấn đề là nhóm lõi Magento đã quên lưu trữ các khối tĩnh và những gì không được lưu trong bộ nhớ cache riêng lẻ không thể bị đục lỗ.
Vì vậy, giải pháp là sửa bộ nhớ đệm trước .
Thật vậy, giải pháp sẽ là thay đổi cách thực hiện bộ nhớ đệm.
FPC của Lesti đang làm điều này ngay trong món quà lưu niệm của tôi và nó miễn phí. Nó chỉ thiếu sự hỗ trợ của nhiều trang web, nhưng nó hoàn hảo cho 1 trang web và bạn sẽ có thể chỉ định các khối phải được tự động đục lỗ.
Tôi cũng đã thử FPC của Amasty, bạn sẽ phải trả tiền cho nó và đó không phải là giải pháp bộ đệm hoàn hảo cho CE tôi đoán, nhưng nó hoạt động tốt, bạn có thể chỉ định bộ đệm của các khối / trang hoặc cả hai. Bạn cũng có thể đặt tốc độ nén của các đối tượng được lưu trong bộ nhớ cache và lưu trữ chúng trong Db / Filesystem (chậm) hoặc memcached.
Chúc bạn may mắn.