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?

gebuket
quelle
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

amitshree
quelle
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
Elvin Risti
quelle
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;
    }

}
Leitender Entwickler
quelle
Wie haben Sie FinalPriceBox durch ExtendPriceBox mit di.xml ersetzt?
Siddhesh
Ja, mitdi.xml
Lead Developer
0

Sie können nicht zwischenspeicherbare Blöcke nur zu benutzerdefinierten Seiten hinzufügen. Andernfalls funktioniert der Magento-Seiten-Cache für diese Seiten nicht ODER aktualisiert die Informationen blockweise über Ajax (Magento-Abschnittsanforderungen).

Einige der hier beschriebenen Dinge https://mirasvit.com/blog/magento-2-page-cache-coverage-rate.html

Alex
quelle