Как отключить кеш для блока в Magento 2?

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

    public function getCacheKeyInfo()
    {
        return [];
    }

не работает. Зачем? Как отключить кеш для блока?

gebuket
источник
Я подозреваю, что ваш блок находится внутри другого блока, который также кэшируется. Например, все, что вы помещаете в блок нижнего колонтитула, кэшируется, потому что вывод блока нижнего колонтитула кэшируется.
Смарти
@ Смарт, как выключить меня? <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

amitshree
источник
20
Это очень неуместно, так как single cacheable = "false" отключит кэширование всей страницы для всей страницы, что делает поиск страниц из этого файла макета чрезвычайно медленным!
Дмитрий Сологубенко
Это верно, что он отключит кеш для всей страницы и уже упоминался в URL, которым я поделился magento.stackexchange.com/a/93473/9169 . Если у вас другой подход, не стесняйтесь поделиться им в качестве нового ответа.
amitshree
Прочитайте эту статью, отличное объяснение: inviqa.com/blog/how-full-page-cache-works-magento-2
Дмитрий Сологубенко
Потрясающее решение. Работай как шарм.
Jalpesh Patel
Это плохая идея для производительности. = (
Кирби
15

Важно понимать, почему вы не хотите кешировать блоки. Если это предназначено для отображения некоторой информации, относящейся к сессии, то вам следует изучить

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

(!) cacheable = "false" не должен использоваться. Здесь будет следовать, почему нет:

Блок с cacheable = "false" сделает всю страницу не кешированной. Он не используется для пробивки кеша. Также следующая страница говорит следующее ( Чтобы создать не кэшируемую страницу , пометьте любой блок на этой странице как не кэшируемый в макете, используя cacheable = "false" ):

Что он делает, так это то, что модули Varnish / Fastly будут отправлять из-за этого значения атрибута всегда не кешируемые заголовки.

Когда мы включаем 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

где первый должен отправить публичный Cache-Control с TTL, а второй должен отправить X-Magento-теги для Varnish / Fastly.

Оба используют проверку isCacheable (), где это всегда возвращает FALSE из-за следующей проверки (проверьте, есть ли в текущем макете какие-либо атрибуты: cacheable = "false"):

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

Когда мы удаляем cacheable = "false", мы начинаем получать проверки isCacheable () как TRUE, а также правильно получать заголовки на страницах start / category- / productpages.

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 Page Cache не будет работать для этих страниц ИЛИ обновлять информацию в блоке через ajax (запросы раздела magento).

Некоторые вещи описаны здесь https://mirasvit.com/blog/magento-2-page-cache-coverage-rate.html

Alex
источник