【问题标题】:Disable full page caching for specific block禁用特定块的整页缓存
【发布时间】:2013-05-31 07:38:30
【问题描述】:

我正在使用具有整页缓存功能的 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),

    ));
}

也许我在整页缓存机制中遗漏了一些东西?

【问题讨论】:

  • 您要查找的词是hole punching;在清漆 FPC 的情况下,您还需要通过 javascript Ajax 对动态内容进行打孔。你使用什么缓存方法?
  • @Luceos 老实说,我还不知道,我想这是 Magento EE 附带的。
  • 这里值得一提的是,当 cache_lifetime 设置为 0 时,Magento 会令人惊讶地将该块缓存 7200 秒 inchoo.net/magento/magento-block-caching

标签: magento caching


【解决方案1】:

好吧,我找到了一些不错的帖子,并使用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变量。我相信当没有真正改变时,可以节省冗余的重新加载块。

我在其他教程中没有发现的是,我必须创建布局变量并将其分配给我的块,否则我只会得到我的块而不是整个页面。

【讨论】:

  • 这可以禁用此容器块的缓存,但我对以这种方式创建的任何无缓存容器块的子块有问题。问题是容器块的缓存过期后,我不再能够通过 $this->getChildHtml 甚至 $this->getBlockHtml 获取子块的任何内容。有什么建议吗?
  • 重新加载时同样的问题。运行 EE
【解决方案2】:

这是为特定控制器禁用 FPC 的解决方案(也可以扩展到特定操作)。

首先创建一个 Observer 来监听 controller_action_predispatch 事件:

    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/

【讨论】:

  • 可能如果你使用这个,每次请求调用时缓存都会失效$cache-&gt;banUse('full_page');
  • 感谢这个解决方案,但我每次只需要渲染一个块,任何控制器都需要它。
  • 仅为特定控制器禁用 FPC,但您也可以使用以下代码 Mage::app() ->getCacheInstance() ->banUse(Mage_Core_Block_Abstract::CACHE_GROUP);
【解决方案3】:

cache_lifetime 必须设置为 null 才能禁用此块的缓存

public function __construct()
 {
    $this->addData(array(
    ‘cache_lifetime’ => null,       
   ));
 }

【讨论】:

    猜你喜欢
    • 2022-01-15
    • 2015-04-22
    • 1970-01-01
    • 1970-01-01
    • 2015-04-01
    • 2019-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多