静的ブロックFPCホールパンチ


16

静的ブロック(cmsブロック)のFPCホールパンチを作成する最も簡単な方法は何ですか?

ページの読み込みごとに動的にしたい動作を持つ内部ブロックを呼び出す静的ブロックがあるとします。

回答:


10

Magento EnterpriseのFull Page Cachingモジュールで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"}}


グラハムに感謝します。試してみて、どのようになったかをお知らせします。
LDusan 2014

@LDusanで問題は解決しましたか?
グラハム14

まだ試していませんでしたが、お知らせします:)
LDusan 2014

Grahamこれは機能すると思いますが、唯一の欠点は、既存のcmsブロッククラスをキャッシュしないように変更する必要があることですが、それが適切なソリューションであることです。ありがとう。
LDusan 14年

3

問題は、Magentoのコアチームが静的ブロックをキャッシュするのを忘れており、個別にキャッシュされていないものはホールパンチできないことです。

したがって、解決策は最初にキャッシュ修正することです。


1

実際、解決策はキャッシングの方法を変更することです。

レスティのFPCは私のお土産でこれを正しくやっていて、無料です。複数のWebサイトをサポートするだけではありませんが、1つのWebサイトと動的に穴を開ける必要があるブロックを指定できる1つのWebサイトに最適です。

AmastyのFPCも試してみました、あなたはそれを支払う必要があり、それは私が推測するCEのための完璧なキャッシングソリューションではありませんが、うまく機能しています、あなたはブロック/ページまたは両方のキャッシングを指定できます。キャッシュされたオブジェクトの圧縮率を設定し、Db / Filesystem(遅い)またはmemcachedに保存することもできます。

あなたの幸運を祈ります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.