Jak wyłączyć pamięć podręczną bloku w Magento 2?


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

    public function getCacheKeyInfo()
    {
        return [];
    }

nie działa. Czemu? Jak wyłączyć pamięć podręczną dla bloku?


Podejrzewam, że twój blok znajduje się w innym bloku, który również jest buforowany. Na przykład wszystko, co umieścisz w bloku stopki, jest buforowane, ponieważ dane wyjściowe bloku stopki są buforowane.
Smartie

@Smartie jak mnie wyłączyć? <referenceContainer name = "content"> <block class = "class" template = "block.phtml" before = "product.info.main" /> </referenceContainer>
gebuket

Odpowiedzi:


27

Bloki można ustawić jako nie do buforowania, ustawiając cacheableatrybut falsew plikach XML układu. Na przykład

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

Strony zawierające takie bloki nie są buforowane.

Sprawdź także, jak wyłączyć buforowanie niestandardowego bloku

Edycja: Pojedyncza cacheable="false"wyłączy Pełne buforowanie stron dla całej strony, dzięki czemu pobieranie stron z tego pliku układu będzie bardzo wolne! Sprawdź https://inviqa.com/blog/how-full-page-cache-works-magento-2


20
Jest to bardzo nieodpowiednie, pojedyncze buforowanie = "false" wyłączy Pełne buforowanie stron dla całej strony, powodując, że strony będą pobierać dane z tego pliku układu bardzo wolno!
Dmitri Sologoubenko

To prawda, że ​​wyłączy pamięć podręczną dla całej strony i jest już wspomniana w adresie URL, który udostępniłem magento.stackexchange.com/a/93473/9169 . Jeśli masz inne podejście, możesz je udostępnić jako nową odpowiedź.
amitshree

Przeczytaj ten artykuł, świetne wyjaśnienie: inviqa.com/blog/how-full-page-cache-works-magento-2
Dmitri Sologoubenko

Niesamowite rozwiązanie. Pracuj jak urok.
Jalpesh Patel

To zły pomysł na wydajność. = (
Kirby,

15

Ważne jest, aby zrozumieć, dlaczego nie chcesz buforować bloku. Jeśli ma to na celu pokazanie niektórych informacji specyficznych dla sesji, powinieneś przyjrzeć się temu

Jedną niezalecaną opcją może być również niestandardowy kontroler, który zwraca niektóre dane przez wywołanie ajax (z metodą POST, aby nie był buforowany).

(!) cacheable = „false” nie może być użyte. Oto, dlaczego nie:

Blok z cacheable = "false" spowoduje, że cała strona nie będzie buforowana. Nie służy do dziurkowania w pamięci podręcznej. Mówi to również następująca strona ( aby utworzyć stronę nieuleczalną , zaznacz dowolny blok na tej stronie jako nieuleczalny w układzie, używając cacheable = "false" ):

Działa to tak, że moduły Varnish / Fastly będą wysyłane, ponieważ ta wartość atrybutu zawsze nie nadaje się do buforowania nagłówków.

Kiedy włączymy cachable = "false" i podczas używania Varnish / Fastly, wysyłane są następujące nagłówki:

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

W tym celu można debugować kod buforowania stron Magento

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

gdzie pierwszy powinien wysłać publiczną kontrolę pamięci podręcznej z TTL, a drugi - X-Magento-Tags dla Varnish / Fastly.

Oba używają sprawdzania isCacheable (), gdzie zawsze zwraca FAŁSZ z powodu następującego sprawdzenia (sprawdź, czy w bieżącym układzie są jakieś atrybuty: cacheable = "false"):

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

Kiedy usuwamy cacheable = "false", wtedy zaczynamy sprawdzać isCacheable () jako PRAWDA, a także poprawnie otrzymywać nagłówki na stronach 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

Zrobiłem non-cacheabledla bloku cenowego

<?php

namespace Custom\Module\Block\Pricing\Render;

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

    public function getCacheLifetime()
    {
        return null;
    }

}

Jak zamieniłeś FinalPriceBox na ExtendPriceBox za pomocą di.xml?
siddhesh

Tak, używającdi.xml
Lead Developer

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.