Cú đấm lỗ khối FPC tĩnh


16

Điều gì sẽ là cách dễ nhất để tạo ra một cú đấm lỗ FPC cho khối tĩnh (khối cms)?

Giả sử tôi có một khối tĩnh gọi một khối khác bên trong có hành vi tôi muốn động trên mỗi lần tải trang.

Câu trả lời:


10

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 đó.

  1. 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());
        }
    
    }
    
  2. 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();
        }
    }
    
  3. 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>
    
  4. 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"}}


Cảm ơn Graham, tôi sẽ thử và cho bạn biết nó đã đi như thế nào.
LDusan

Điều này đã giải quyết vấn đề của bạn cho bạn @LDusan?
Graham

Chưa thử, tôi sẽ cho bạn biết :)
LDusan

Graham Tôi nghĩ rằng điều này hoạt động, nhược điểm duy nhất là bạn sẽ phải thay đổi các lớp khối cms hiện có nếu bạn muốn chúng không được lưu trong bộ nhớ cache, nhưng bất kể đó là một giải pháp tốt. Cảm ơn.
LDusan


1

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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.