Come disabilitare la cache per il blocco in Magento 2?


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

    public function getCacheKeyInfo()
    {
        return [];
    }

non funziona. Perché? Come disabilitare la cache per blocco?


Ho il sospetto che il tuo blocco sia all'interno di un altro blocco che è anche memorizzato nella cache. Ad esempio, tutto ciò che viene inserito all'interno del blocco piè di pagina viene memorizzato nella cache perché l'output del blocco di piè di pagina viene memorizzato nella cache.
Smartie,

@Smartie come disattivarlo? <referenceContainer name = "content"> <block class = "class" template = "block.phtml" before = "product.info.main" /> </referenceContainer>
gebuket

Risposte:


27

I blocchi possono essere impostati come non memorizzabili nella cache impostando l' cacheableattributo falsenei file XML di layout. Per esempio

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

Le pagine contenenti tali blocchi non vengono memorizzate nella cache.

Controlla anche come disabilitare la memorizzazione nella cache del blocco personalizzato

Modifica: un singolo cacheable="false"disabiliterà la memorizzazione nella cache della pagina intera per l'intera pagina, rendendo le pagine provenienti da quel file di layout estremamente lente! Controlla https://inviqa.com/blog/how-full-page-cache-works-magento-2


20
Questo è molto inappropriato, un singolo cacheable = "false" disabiliterà la memorizzazione nella cache della pagina intera per l'intera pagina, rendendo le pagine provenienti da quel file di layout estremamente lente!
Dmitri Sologoubenko,

È corretto che disabiliterà la cache per l'intera pagina e già menzionata nell'URL che ho condiviso magento.stackexchange.com/a/93473/9169 . Se hai un approccio diverso, sentiti libero di condividerlo come nuova risposta.
entro il

Leggi questo articolo, grande spiegazione: inviqa.com/blog/how-full-page-cache-works-magento-2
Dmitri Sologoubenko

Soluzione eccezionale. Lavora come un fascino.
Jalpesh Patel,

Questa è una cattiva idea per le prestazioni. = (
Kirby,

15

È importante capire perché non si desidera bloccare la cache. Se questo ha lo scopo di mostrare alcune informazioni specifiche della sessione, allora dovresti esaminare

Un'opzione non consigliata potrebbe essere anche un controller personalizzato che restituisce alcuni dati tramite ajax-call (con il metodo POST in modo che non venga memorizzato nella cache).

(!) cacheable = "false" non deve essere utilizzato. Qui seguirà, PERCHÉ no:

Un blocco con cacheable = "false" renderà l'intera pagina non memorizzata nella cache. Non viene utilizzato per la perforazione della cache. Anche la seguente pagina dice questo ( Per creare una pagina non memorizzabile , contrassegnare qualsiasi blocco su quella pagina come non memorizzabile nel layout usando cacheable = "false" ):

Quello che fa è che i moduli Varnish / Fastly invieranno a causa di questo valore di attributo sempre intestazioni non memorizzabili nella cache.

Quando abilitiamo cachable = "false" e durante l'utilizzo di Varnish / Fastly vengono inviate le seguenti intestazioni sul lato browser:

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

Per questo può essere eseguito il debug del codice di memorizzazione nella cache della pagina di Magento

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

dove il primo dovrebbe inviare Cache-Control pubblico con TTL e il secondo dovrebbe inviare X-Magento-Tag per Varnish / Fastly.

Entrambi utilizzano isCacheable () check dove restituisce sempre FALSE a seguito del controllo (controlla se nel layout corrente sono presenti attributi: cacheable = "false"):

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

Quando rimuoviamo cacheable = "false", iniziamo a ottenere i controlli isCacheable () come TRUE e anche a ottenere correttamente le intestazioni nelle pagine 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

8

Ho fatto non-cacheableper il blocco dei prezzi

<?php

namespace Custom\Module\Block\Pricing\Render;

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

    public function getCacheLifetime()
    {
        return null;
    }

}

Come hai sostituito FinalPriceBox con ExtendPriceBox usando di.xml?
siddhesh,

Sì, utilizzandodi.xml
Sviluppatore principale

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.