Як відключити кеш-пам'ять блоку в Magento 2?


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

    public function getCacheKeyInfo()
    {
        return [];
    }

не працює. Чому? Як відключити кеш для блоку?


Я підозрюю, що ваш блок знаходиться в іншому блоці, який також є кешованим. Наприклад, все, що ви помістите всередину блоку нижнього колонтитулу, буде кешоване, тому що вихід блоку нижнього колонтитулу кешований.
Смарті

@Smartie як відключити це від мене? <referenceContainer name = "content"> <block class = "class" template = "block.phtml" before = "product.info.main" /> </referenceContainer>
gebuket

Відповіді:


27

Блоки можна встановити як не кешовані, встановивши cacheableатрибут falseу макеті XML-файлів. Наприклад

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

Сторінки, що містять такі блоки, не кешуються.

Також перевірте, як відключити кешування користувацького блоку

Редагувати: один cacheable="false"вимкне загальний кешування сторінок для всієї сторінки, завдяки чому джерела сторінок із цього файлу макета будуть дуже повільними! Перевірте https://inviqa.com/blog/how-full-page-cache-works-magento-2


20
Це дуже недоречно, один кешируемый = "false" відключить кешування сторінок для всієї сторінки, завдяки чому пошук сторінок із цього файлу компонування буде дуже повільним!
Дмитро Сологубенко

Це правильно, що він вимкне кеш для всієї сторінки і вже згадується в URL- адресі, яку я поділив magento.stackexchange.com/a/93473/9169 . Якщо у вас інший підхід, не соромтесь поділитися ним як новою відповіддю.
amitshree

Прочитайте цю статтю, чудове пояснення: inviqa.com/blog/how-full-page-cache-works-magento-2
Дмитро

Дивовижне рішення. Працюйте як шарм.
Jalpesh Patel

Це погана ідея для продуктивності. = (
Кірбі

15

Важливо зрозуміти, чому ви не хочете кешувати блок. Якщо це означає, щоб показати певну інформацію про сеанс, то вам слід вивчити

Одним із нерекомендованих варіантів може бути також користувацький контролер, який повертає деякі дані через ajax-call (з методом POST, щоб він не був кешований).

(!) cacheable = "false" не слід використовувати. Тут буде далі, ЧОМУ ні:

Блок з кешованим = "помилковим" зробить всю сторінку без кешування. Він не використовується для пробивання отворів кешу. Наступна сторінка говорить про це ( Щоб створити сторінку , яку не можна кешувати , позначте будь-який блок на цій сторінці як неможливий керування в макеті, використовуючи cacheable = "false" ):

Це означає, що модулі Varnish / Fast будуть надсилати через це значення атрибутів завжди не кешовані заголовки.

Коли ми вмикаємо cachable = "false" і під час використання Varnish / Fastly, на стороні браузера надсилаються наступні заголовки:

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

Для цього можна налагодити код кешування сторінки Magento на

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

де перший повинен надіслати загальнодоступний кеш-контроль за допомогою TTL, а другий - надіслати X-Magento-теги для лаку / швидко.

Обидва використовують прапорець isCacheable (), де це завжди повертає FALSE за допомогою наступної перевірки (перевірити, чи є в поточному макеті якісь атрибути: cacheable = "false"):

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

Коли ми видаляємо cacheable = "false", тоді ми починаємо отримувати чеки isCacheable () як TRUE, а також отримуємо заголовки правильно на сторінках 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

Я зробив non-cacheableдля цінового блоку

<?php

namespace Custom\Module\Block\Pricing\Render;

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

    public function getCacheLifetime()
    {
        return null;
    }

}

Як ви замінили FinalPriceBox на ExtendPriceBox, використовуючи di.xml?
сиддеш

Так, використовуйтеdi.xml
Ведучий розробник

0

Ви можете додати не кешований блок лише на спеціальні сторінки. В іншому випадку кеш-пам'ять сторінки Magento не працюватиме на цих сторінках АБО оновлення інформації в блоці через ajax (запити розділу magento).

Деякі речі, описані тут https://mirasvit.com/blog/magento-2-page-cache-coverage-rate.html

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.