如何在Magento 2中禁用该块的缓存?


23
protected function _construct()
    {
        $this->addData(
            [
                'cache_lifetime' => false,
                'cache_tags' => array('MY_BLOCK'),
            ]
        );
    }

    public function getCacheKeyInfo()
    {
        return [];
    }

不起作用。为什么?如何禁用缓存块?


我怀疑您的块在另一个也被缓存的块中。例如,您缓存在页脚块中的所有内容都会被缓存,因为页脚块的输出将被缓存。
Smartie

@Smartie如何关闭我?<referenceContainer name =“ content”> <block class =“ class” template =“ block.phtml” before =“ product.info.main” /> </ referenceContainer>
gebuket

Answers:


27

通过在布局XML文件中设置cacheable属性false,可以将块设置为不可缓存。例如

<block class="Block\Class" name="blockname" cacheable="false" />

包含此类块的页面不会被缓存。

还要检查如何禁用自定义块的缓存

编辑:单个cacheable="false"将禁用整个页面的全页缓存,这使得从该布局文件中获取页面的速度非常慢!检查https://inviqa.com/blog/how-full-page-cache-works-magento-2


20
这是非常不合适的,单个cacheable =“ false”将禁用整个页面的全页缓存,这使得从该布局文件中获取页面的速度非常慢!
Dmitri Sologoubenko '16

正确的是,它将禁用整个页面的缓存,并且在我共享的magento.stackexchange.com/a/93473/9169 URL中已经提到。如果您采用其他方法,请随时将其作为新答案分享。
阿米什里

阅读这篇文章,获得很好的解释:inviqa.com/blog/how-full-page-cache-works-magento-2
Dmitri Sologoubenko

很棒的解决方案。像魅力一样工作。
Jalpesh Patel '18

这对性能来说是个坏主意。=(
柯比,

15

了解为什么不想缓存块很重要。如果这是为了显示一些特定于会话的信息,那么您应该调查一下

一个不推荐的选项也可以是自定义控制器,它通过ajax调用返回一些数据(使用POST方法,因此不会被缓存)。

(!)cacheable =“ false”不能使用。为什么不呢?

带有cacheable =“ false”的块将使整个页面不被缓存。它不用于高速缓存打孔。同样在下面的页面上这样说(创建不可缓存的页面,请使用cacheable =“ false”将该页面上的任何块标记为在布局中不可缓存):

这是因为该属性值始终是不可缓存的标头,因此会发送Varnish / Fastly模块。

当我们启用cachable =“ false”并在使用Varnish / Fastly时,将发送浏览器端以下标头:

X-Magento-Cache-Debug:MISS
X-Magento-Cache-Control:max-age=0, must-revalidate, no-cache, no-store
Age: 0

为此可以调试Magento的页面缓存代码在

vendor/magento/module-page-cache/Model/Layout/LayoutPlugin.php::afterGenerateXml
vendor/magento/module-page-cache/Model/Layout/LayoutPlugin.php::afterGetOutput

第一个应该发送带有TTL的公共缓存控制,第二个应该发送用于清漆/快速的X-Magento-Tag。

两者都使用isCacheable()检查,由于以下检查(检查当前布局中是否有任何属性:cacheable =“ false”),该方法始终返回FALSE:

$cacheableXml = !(bool)count($this->getXml()->xpath('//' . Element::TYPE_BLOCK . '[@cacheable="false"]'));

当我们删除cacheable =“ false”时,我们开始将isCacheable()检查为TRUE,并且还可以在start- / category- / productpages上正确获取标头。

X-Magento-Cache-Control:max-age=86400, public, s-maxage=86400
X-Magento-Cache-Debug:HIT
X-Magento-Cache-Hits:1
Age:32

8

我已经non-cacheable为定价块

<?php

namespace Custom\Module\Block\Pricing\Render;

class ExtendFinalPriceBox extends \Magento\Catalog\Pricing\Render\FinalPriceBox {

    public function getCacheLifetime()
    {
        return null;
    }

}

您如何使用di.xml用ExtendPriceBox替换FinalPriceBox?
siddhesh

使用的是di.xml
首席开发人员

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.