Comment désactiver le cache du bloc dans Magento 2?


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

    public function getCacheKeyInfo()
    {
        return [];
    }

ne marche pas. Pourquoi? Comment désactiver le cache pour le bloc?


Je soupçonne que votre bloc se trouve dans un autre bloc qui est également mis en cache. Par exemple, tout ce que vous mettez dans le bloc de pied de page est mis en cache car la sortie du bloc de pied de page est mise en cache.
Smartie

@Smartie comment le désactiver moi? <referenceContainer name = "content"> <block class = "class" template = "block.phtml" before = "product.info.main" /> </referenceContainer>
gebuket

Réponses:


27

Les blocs peuvent être définis comme ne pouvant pas être mis en cache en définissant l' cacheableattribut falsedans les fichiers XML de mise en page. Par exemple

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

Les pages contenant de tels blocs ne sont pas mises en cache.

Vérifiez également comment désactiver la mise en cache du bloc personnalisé

Modifier: un seul cacheable="false"désactivera la mise en cache de la page entière pour toute la page, ce qui rendra les pages à partir de ce fichier de mise en page extrêmement lentes! Vérifiez https://inviqa.com/blog/how-full-page-cache-works-magento-2


20
Ceci est très inapproprié, un seul cacheable = "false" désactivera la mise en cache de la page complète pour la page entière, ce qui rendra les pages à partir de ce fichier de mise en page extrêmement lentes!
Dmitri Sologoubenko

Il est correct qu'il désactivera le cache pour toute la page et déjà mentionné dans l'url que j'ai partagée magento.stackexchange.com/a/93473/9169 . Si vous avez une approche différente, n'hésitez pas à la partager comme nouvelle réponse.
amitshree


Super solution. Travaillez comme par enchantement.
Jalpesh Patel

C'est une mauvaise idée pour la performance. = (
Kirby

15

Il est important de comprendre pourquoi vous ne souhaitez pas mettre en cache le bloc. Si cela est destiné à afficher des informations spécifiques à la session, vous devriez

Une option non recommandée pourrait également être un contrôleur personnalisé qui renvoie certaines données via ajax-call (avec la méthode POST afin qu'elles ne soient pas mises en cache).

(!) cacheable = "false" ne doit pas être utilisé. Ici suivra, POURQUOI non:

Un bloc avec cacheable = "false" rendra la page entière non mise en cache. Il n'est pas utilisé pour la perforation du cache. La page suivante le dit également ( pour créer une page non mise en cache , marquez tout bloc de cette page comme non mise en cache dans la mise en page en utilisant cacheable = "false" ):

Ce que cela fait, c'est que les modules Varnish / Fastly enverront en raison de cette valeur d'attribut toujours des en-têtes non cachables.

Lorsque nous activons cachable = "false" et lors de l'utilisation de Varnish / Fastly, les en-têtes suivants du navigateur sont envoyés:

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

Pour cela, vous pouvez déboguer le code de mise en cache des pages de Magento sur

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

où le premier doit envoyer un Cache-Control public avec TTL et le second doit envoyer des X-Magento-Tags pour Varnish / Fastly.

Les deux utilisent la vérification isCacheable () où cela renvoie toujours FALSE en raison de la vérification suivante (vérifiez si dans la disposition actuelle il y a des attributs: cacheable = "false"):

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

Lorsque nous supprimons cacheable = "false", nous commençons à obtenir les vérifications isCacheable () comme VRAI et également à obtenir correctement les en-têtes sur les pages de démarrage / catégorie / produit.

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

8

J'ai fait non-cacheablepour le bloc de prix

<?php

namespace Custom\Module\Block\Pricing\Render;

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

    public function getCacheLifetime()
    {
        return null;
    }

}

Comment avez-vous remplacé FinalPriceBox par ExtendPriceBox en utilisant di.xml?
siddhesh

Oui, en utilisantdi.xml
Lead Developer

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.