Como desativar o cache do bloco no Magento 2?

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

    public function getCacheKeyInfo()
    {
        return [];
    }

não funciona. Por quê? Como desativar o cache do bloco?

gebuket
fonte
Suspeito que seu bloco esteja dentro de outro bloco que também é armazenado em cache. Por exemplo, qualquer coisa que você colocar dentro do bloco de rodapé é armazenada em cache porque a saída do bloco de rodapé é armazenada em cache.
24716 Smartie
@ Smartie como desligar isso de mim? <referenceContainer name = "content"> <bloco class = "class" template = "block.phtml" antes = "product.info.main" /> </referenceContainer>
gebuket

Respostas:

27

Os blocos podem ser configurados como não armazenáveis ​​em cache, definindo o cacheableatributo falsenos arquivos XML de layout. Por exemplo

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

As páginas que contêm esses blocos não são armazenadas em cache.

Verifique também como desativar o cache do bloco personalizado

Editar: Um único cacheable="false"desabilitará o Cache de página inteira para toda a página, tornando as páginas provenientes desse arquivo de layout extremamente lentas! Verifique https://inviqa.com/blog/how-full-page-cache-works-magento-2

amitshree
fonte
20
Isso é muito inadequado, um único cache = "false" desabilitará o Cache de página inteira para toda a página, tornando as páginas provenientes desse arquivo de layout extremamente lentas!
Dmitri Sologoubenko #
É correto que ele desabilite o cache de toda a página e já mencionei no URL que compartilhei magento.stackexchange.com/a/93473/9169 . Se você tiver uma abordagem diferente, sinta-se à vontade para compartilhá-la como uma nova resposta.
amitshree
Leia este artigo, ótima explicação: inviqa.com/blog/how-full-page-cache-works-magento-2 #
Dmitri Sologoubenko #
Solução incrível. Trabalhe como charme.
Jalpesh Patel
Essa é uma má ideia para o desempenho. = (
Kirby
15

É importante entender por que você não deseja armazenar em cache o bloco. Se isso pretende mostrar algumas informações específicas da sessão, você deve procurar

Uma opção não recomendada também pode ser o controlador personalizado, que retorna alguns dados por chamada ajax (com o método POST para que não seja armazenado em cache).

(!) cacheable = "false" não deve ser usado. A seguir, por que não:

Um bloco com cacheable = "false" tornará a página inteira sem cache. Não é usado para perfuração de cache. A página a seguir também diz isso ( Para criar uma página não rastreável , marque qualquer bloco nessa página como não rastreável no layout usando cacheable = "false" ):

O que faz é que os módulos Varnish / Fastly enviarão devido a esse valor de atributo sempre cabeçalhos que não podem ser armazenados em cache.

Quando ativamos o cachable = "false" e, ao usar o Varnish / Fastly, os cabeçalhos do navegador são enviados:

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

Para isso, pode ser depurado o código de cache da página do Magento em

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

onde o primeiro deve enviar o Cache-Control público com TTL e o segundo deve enviar o X-Magento-Tags para Varnish / Fastly.

Ambos estão usando a verificação isCacheable (), onde sempre retorna FALSE após a verificação seguinte (verifique se no layout atual há algum atributo: cacheable = "false"):

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

Quando removemos cacheable = "false", começamos a obter as verificações isCacheable () como TRUE e também obtemos os cabeçalhos corretamente nas páginas start / category / product.

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

Eu criei non-cacheablepara o bloco de preços

<?php

namespace Custom\Module\Block\Pricing\Render;

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

    public function getCacheLifetime()
    {
        return null;
    }

}
Desenvolvedor-chefe
fonte
Como você substituiu FinalPriceBox por ExtendPriceBox usando di.xml?
Siddhesh
Sim usandodi.xml
Lead Developer
0

Você pode adicionar bloco não armazenável em cache apenas a páginas personalizadas. Em outro caso, o Magento Page Cache não funcionará para essas páginas OU atualizará as informações em bloco via ajax (solicitações de seção magento).

Algumas coisas descritas aqui https://mirasvit.com/blog/magento-2-page-cache-coverage-rate.html

Alex
fonte