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?

gebuket
źródło
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

amitshree
źródło
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
Elvin Risti
źródło
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;
    }

}
Główny programista
źródło
Jak zamieniłeś FinalPriceBox na ExtendPriceBox za pomocą di.xml?
siddhesh
Tak, używającdi.xml
Lead Developer
0

Możesz dodać blok, którego nie można buforować, tylko do niestandardowych stron. W innym przypadku pamięć podręczna strony magento nie będzie działać dla tych stron LUB aktualizacji informacji w bloku za pośrednictwem ajax (żądania sekcji magento).

Niektóre rzeczy opisane tutaj https://mirasvit.com/blog/magento-2-page-cache-coverage-rate.html

Alex
źródło