3

フルページキャッシュ機能を持つmagento EEを使用しています。動的に更新されるブロックがありますが、キャッシュを無効にできないようです。私が理想的に達成したいのは、特定のブロックに対してのみキャッシュを無効にして、ページが読み込まれるたびに再度レンダリングされるようにすることです。私が試したこと:

unsetData をレイアウト ファイルに含める

<action method="unsetData"><key>cache_lifetime</key></action>
<action method="unsetData"><key>cache_tags</key></action>

関数 _saveCache を設定して false を返す

protected function _saveCache($data, $id, $tags = array(), $lifetime = null) {
    return false;
}

に異なる値を設定するcache_lifetime

public function __construct()
{
    $this->addData(array(
    ‘cache_lifetime’ => 0,
    ‘cache_tags’ => array(Mage_Catalog_Model_Product::CACHE_TAG),

    ));
}

おそらく、フル ページ キャッシングの仕組みに何か欠けているのでしょうか?

4

3 に答える 3

4

さて、私はいくつかの良い投稿を見つけてetc/cache.xml、ブロックをコンテナー オブジェクトでラップする でキャッシングを実装しました。

私のcache.xml

<?xml version="1.0" encoding="UTF-8"?>
<config>
<placeholders>
    <namespace_block_unique_node>
        <block>module/block_class</block>
        <name>name_of_block_in_my_layout</name>
        <template>path/to/my/template</template>
        <placeholder>UNIQUE_PLACEHOLDER_HERE</placeholder>
        <container>Namespace_Module_Model_Caching_Container_BlockName</container>
        <cache_lifetime>86400</cache_lifetime>
    </namespace_block_unique_node> 
</placeholders>
</config>

ここではblock、キャッシュしてはならないnameブロック、レイアウト内のブロックの名前、およびcontainerコンテナーを選択したときに使用しました。

コンテナのコー​​ド:

<?php

class Namespace_Module_Model_Caching_Container_BlockName extends Enterprise_PageCache_Model_Container_Abstract 
{

protected function _getCacheId()
{
    return 'NAMESPACE_MODULE_BLOCKNAME' . $this->_getIdentifier();
}

protected function _getIdentifier() 
{
    return microtime();
}

protected function _renderBlock() 
{
    $blockClass = $this->_placeholder->getAttribute('block');
    $template = $this->_placeholder->getAttribute('template');
    $block = new $blockClass;
    $block->setTemplate($template);
    $layout = Mage::app()->getLayout();
    $block->setLayout($layout);
    return $block->toHtml();

}

protected function _saveCache($data, $id, $tags = array(), $lifetime = null) { return false;}
}

ここではmicrotime()、ブロックを識別する関数を配置しましたが、モジュール内では、モジュールに関連する Cookie 変数を使用しました。実際には何も変更されていない場合、ブロックの冗長なリロードを節約できると思います。

他のチュートリアルで見つけられなかったのは、レイアウト変数を作成してブロックに割り当てる必要があったことです。そうしないと、ページ全体ではなくブロックのみを取得していました。

于 2013-05-31T11:41:58.930 に答える
2

これは、特定のコントローラーの FPC を無効にするためのソリューションです (特定のアクションにも拡張できます)。

まず、controller_action_predispatch イベントをリッスンする Observer を作成します。

    public function processPreDispatch(Varien_Event_Observer $observer)
    {
        $action = $observer->getEvent()->getControllerAction();

        // Check to see if $action is a Product controller
        if ($action instanceof Mage_Catalog_ProductController)
        {
            $request = $action->getRequest();
            $cache = Mage::app()->getCacheInstance();

            // Tell Magento to 'ban' the use of FPC for this request
            $cache->banUse('full_page');
        }
    }

次に、モジュールの config.xml ファイルに以下を追加します。これは次のセクションにあります。

    <events>
        <controller_action_predispatch>
            <observers>
                <YOUR_UNIQUE_IDENTIFIER>
                    <class>YOURMODULE/observer</class>
                    <method>processPreDispatch</method>
                </YOUR_UNIQUE_IDENTIFIER>
            </observers>
        </controller_action_predispatch>
    </events>

これで、Magento は毎回ページを提供し、リクエストに対して FPC をバイパスします。

また、参照することもできます: http://mikebywaters.wordpress.com/2011/12/14/disable-magento-full-page-cache-on-a-per-controller-basis/

于 2013-05-31T08:09:07.547 に答える
0

このブロックのキャッシュを無効にするには、cache_lifetime を null に設定する必要があります

public function __construct()
 {
    $this->addData(array(
    ‘cache_lifetime’ => null,       
   ));
 }
于 2014-07-30T08:25:08.443 に答える