静态块FPC打孔机


16

为静态块(cms块)创建FPC打孔的最简单方法是什么?

假设我有一个静态块,它调用内部的另一个块,该块具有我希望在每次页面加载时都是动态的行为。

Answers:


10

我发现在Magento Enterprise的“全页缓存”模块中打孔CMS块的最简单方法有几个步骤:

首先,让我们看一下所需的目录结构:

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.

考虑到这种自上而下的理解,这里是如何填写这些文件的方法。

  1. 创建您自己的块类,以扩展内置的Magento CMS块。您还需要重写“ getCacheKeyInfo”函数,如下所示:

    <?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. 设置占位符模型,该模型负责呈现CMS块而不应用缓存。

    <?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. 设置cache.xml以定位我们新创建的CMS块并使用我们新创建的占位符进行呈现。

    <!-- 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. 在CMS中,将您要尝试在缓存外部渲染的块的块类型替换为我们新创建的CMS验证块: {{block type="cachebuster/cms" block_id="cacheproof"}}


感谢Graham,我将尝试一下,让您知道它的运行情况。
LDusan 2014年

这是否为您解决了@LDusan的问题?
格雷厄姆

还没有尝试过,我会让你知道的:)
LDusan 2014年

格雷厄姆,我认为这行得通,唯一的缺点是,如果您不希望缓存现有的cms块类,那么就必须对其进行更改,但这是一个好的解决方案。谢谢。
LDusan 2014年

3

问题在于,Magento核心团队忘记了缓存静态块,并且没有单独缓存的内容无法打孔。

因此,解决方案是首先修复缓存


1

实际上,解决方案将是更改缓存的完成方式。

Lesti的FPC正在我的纪念品中做到这一点,而且是免费的。它仅缺少多个网站的支持,但是非常适合1个网站,您将能够指定必须动态打孔的块。

我也尝试过Amasty的FPC,您必须为此付费,而且我猜它不是CE的理想缓存解决方案,但是它运作良好,您可以指定块/页面或两者的缓存。您还可以设置缓存对象的压缩率,并将其存储在Db / Filesystem(慢速)或memcached中。

祝您好运。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.