Wie deaktiviere ich den Cache für den Block in Magento 2?


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

    public function getCacheKeyInfo()
    {
        return [];
    }

funktioniert nicht. Warum? Wie deaktiviere ich den Cache für Block?


Ich vermute, Ihr Block befindet sich in einem anderen Block, der ebenfalls zwischengespeichert ist. Beispielsweise wird alles, was Sie in den Fußzeilenblock einfügen, zwischengespeichert, da die Ausgabe des Fußzeilenblocks zwischengespeichert wird.
Smartie

@Smartie wie schalte ich es aus? <referenceContainer name = "content"> <block class = "class" template = "block.phtml" before = "product.info.main" /> </ referenceContainer>
24.

Antworten:


27

Blöcke können als nicht zwischenspeicherbar festgelegt werden, indem das cacheableAttribut falsein Layout-XML-Dateien festgelegt wird. Beispielsweise

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

Seiten, die solche Blöcke enthalten, werden nicht zwischengespeichert.

Überprüfen Sie auch, wie das Zwischenspeichern von benutzerdefinierten Blöcken deaktiviert wird

Bearbeiten: Eine einzelne cacheable="false"Seite deaktiviert das vollständige Seiten-Caching für die gesamte Seite, wodurch die Seitenbeschaffung aus dieser Layoutdatei extrem langsam wird! Überprüfen Sie https://inviqa.com/blog/how-full-page-cache-works-magento-2


20
Dies ist sehr unangemessen, da ein einziges Cacheable = "false" das vollständige Seiten-Caching für die gesamte Seite deaktiviert, wodurch die Seiten, die aus dieser Layoutdatei stammen, extrem langsam werden!
Dmitri Sologoubenko

Es ist richtig, dass der Cache für die gesamte Seite deaktiviert wird . Dies wurde bereits in der URL erwähnt, die ich für magento.stackexchange.com/a/93473/9169 freigegeben habe . Wenn Sie eine andere Herangehensweise haben, teilen Sie diese gerne als neue Antwort mit.
amitshree

Lesen Sie diesen Artikel, tolle Erklärung: inviqa.com/blog/how-full-page-cache-works-magento-2
Dmitri Sologoubenko

Geniale Lösung. Arbeit wie Charme.
Jalpesh Patel

Das ist eine schlechte Idee für die Leistung. = (
Kirby

15

Es ist wichtig zu verstehen, warum Sie Block nicht zwischenspeichern möchten. Wenn dies einige sitzungsspezifische Informationen anzeigen soll, sollten Sie nachsehen

Eine nicht empfohlene Option könnte auch ein benutzerdefinierter Controller sein, der einige Daten über einen Ajax-Aufruf zurückgibt (mit der POST-Methode, damit sie nicht zwischengespeichert werden).

(!) cacheable = "false" darf nicht verwendet werden. Hier folgt, WARUM nicht:

Ein Block mit cacheable = "false" hebt den Cache der gesamten Seite auf. Es wird nicht zum Lochen im Cache verwendet. Dies sagt auch die folgende Seite aus ( Um eine nicht zwischenspeicherbare Seite zu erstellen , markieren Sie einen Block auf dieser Seite im Layout mit cacheable = "false" als nicht zwischenspeicherbar ):

Was es tut, ist, dass Varnish / Fastly-Module aufgrund dieses Attributwerts immer nicht zwischenspeicherbare Header senden.

Wenn wir cachable = "false" aktivieren und Varnish / Fastly verwenden, werden auf der Browserseite folgende Header gesendet:

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

Dafür kann der Seiten-Caching-Code des Magento auf debuggt werden

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

Wobei erstens öffentliches Cache-Control mit TTL und zweitens X-Magento-Tags für Varnish / Fastly gesendet werden sollen.

Beide verwenden die isCacheable () - Prüfung, wobei diese aufgrund der folgenden Prüfung immer FALSE zurückgibt (prüfen Sie, ob im aktuellen Layout Attribute vorhanden sind: cacheable = "false"):

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

Wenn wir cacheable = "false" entfernen, beginnen wir, isCacheable () -Prüfungen als TRUE abzurufen und die Header auf Start- / Kategorie- / Produktseiten korrekt abzurufen.

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

8

Ich habe non-cacheablefür die Preisgestaltung gesperrt

<?php

namespace Custom\Module\Block\Pricing\Render;

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

    public function getCacheLifetime()
    {
        return null;
    }

}

Wie haben Sie FinalPriceBox durch ExtendPriceBox mit di.xml ersetzt?
Siddhesh

Ja, mitdi.xml
Lead Developer

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.