¿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?


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


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


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

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;
    }

}

¿Cómo reemplazó FinalPriceBox con ExtendPriceBox usando di.xml?
siddhesh

Sí usandodi.xml
Desarrollador principal

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.