¿Cómo deshabilitar el caché para el bloque en Magento 2?

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

    public function getCacheKeyInfo()
    {
        return [];
    }

No funciona. ¿Por qué? ¿Cómo deshabilitar el caché para el bloque?

Gebuket
fuente
Sospecho que tu bloque está dentro de otro bloque que también está en caché. Por ejemplo, todo lo que coloque dentro del bloque de pie de página se almacena en caché porque la salida del bloque de pie de página se almacena en caché.
Smartie
@Smartie, ¿cómo apagarlo? <referenceContainer name = "content"> <block class = "class" template = "block.phtml" before = "product.info.main" /> </referenceContainer>
gebuket

Respuestas:

27

Los bloques se pueden configurar como no almacenables en caché configurando el cacheableatributo falseen los archivos XML de diseño. Por ejemplo

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

Las páginas que contienen dichos bloques no se almacenan en caché.

También verifique cómo deshabilitar el almacenamiento en caché del bloque personalizado

Editar: ¡ Un solo cacheable="false"deshabilitará el almacenamiento en caché de página completa para toda la página, haciendo que las páginas que se obtienen de ese archivo de diseño sean extremadamente lentas! Consulte https://inviqa.com/blog/how-full-page-cache-works-magento-2

amitshree
fuente
20
Esto es muy inapropiado, un solo cacheable = "false" deshabilitará el almacenamiento en caché de página completa para toda la página, lo que hace que las páginas de ese archivo de diseño sean extremadamente lentas.
Dmitri Sologoubenko el
Es correcto que deshabilitará el caché para toda la página y ya lo mencioné en la url que he compartido magento.stackexchange.com/a/93473/9169 . Si tiene un enfoque diferente, no dude en compartirlo como una nueva respuesta.
amitshree 01 de
Lea este artículo, gran explicación: inviqa.com/blog/how-full-page-cache-works-magento-2
Dmitri Sologoubenko
Impresionante solución. Trabaja como un encanto.
Jalpesh Patel
Esa es una mala idea para el rendimiento. = (
Kirby
15

Es importante entender por qué no desea bloquear el caché. Si esto está destinado a mostrar información específica de la sesión, entonces debería estar investigando

Una opción no recomendada podría ser también un controlador personalizado que devuelve algunos datos a través de una llamada ajax (con el método POST para que no se almacene en caché).

(!) cacheable = "false" no debe usarse. A continuación, POR QUÉ no:

Un bloque con cacheable = "false" hará que toda la página quede en caché. No se utiliza para perforar caché. Además, la página siguiente dice esto ( para crear una página que no se puede almacenar en caché , marque cualquier bloque en esa página como no almacenable en caché en el diseño usando cacheable = "false" ):

Lo que hace es que los módulos Varnish / Fastly se enviarán debido a este valor de atributo siempre encabezados no almacenables en caché.

Cuando habilitamos cachable = "false" y al usar Varnish / Fastly, se envían los siguientes encabezados del lado del navegador:

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

Para eso se puede depurar el código de almacenamiento en caché de la página de Magento en

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

donde el primero debe enviar un control de caché público con TTL y el segundo debe enviar X-Magento-Tags para Varnish / Fastly.

Ambos usan la verificación isCacheable () donde esto siempre devuelve FALSE debido a la siguiente verificación (verifique si en el diseño actual hay algún atributo: cacheable = "false"):

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

Cuando eliminamos cacheable = "false", comenzamos a obtener verificaciones isCacheable () como VERDADERO y también obtener encabezados correctamente en las páginas de inicio / categoría- / producto.

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
fuente
8

He hecho non-cacheablepara el bloque de precios

<?php

namespace Custom\Module\Block\Pricing\Render;

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

    public function getCacheLifetime()
    {
        return null;
    }

}
Desarrollador principal
fuente
¿Cómo reemplazó FinalPriceBox con ExtendPriceBox usando di.xml?
siddhesh
Sí usandodi.xml
Desarrollador principal
0

Puede agregar bloque no almacenable en caché solo a páginas personalizadas. En otro caso, la memoria caché de página de magento no funcionará para estas páginas O actualizará la información en bloque a través de ajax (solicitudes de la sección de magento).

Algunas cosas descritas aquí https://mirasvit.com/blog/magento-2-page-cache-coverage-rate.html

Alex
fuente