Bagaimana cara menonaktifkan cache untuk blok di Magento 2?


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

    public function getCacheKeyInfo()
    {
        return [];
    }

tidak bekerja. Mengapa? Bagaimana cara menonaktifkan cache untuk blokir?


Saya menduga blok Anda ada di dalam blok lain yang juga di-cache. Misalnya, apa pun yang Anda masukkan ke dalam blok footer di-cache karena output blok footer di-cache.
Smartie

@ Smartie bagaimana cara mematikannya? <referenceContainer name = "content"> <block class = "class" template = "block.phtml" before = "product.info.main" /> </referenceContainer>
gebuket

Jawaban:


27

Blok dapat ditetapkan sebagai non-cacheable dengan mengatur cacheableatribut falsedalam tata letak file XML. Sebagai contoh

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

Halaman yang mengandung blok seperti itu tidak di-cache.

Juga periksa Bagaimana cara menonaktifkan caching blok khusus

Sunting: Satu cacheable="false"akan menonaktifkan Caching Halaman Penuh untuk seluruh halaman, membuat halaman sumber dari file tata letak itu sangat lambat! Periksa https://inviqa.com/blog/how-full-page-cache-works-magento-2


20
Ini sangat tidak pantas, satu cacheable = "false" akan menonaktifkan Caching Halaman Penuh untuk seluruh halaman, membuat halaman yang diambil dari file tata letak itu sangat lambat!
Dmitri Sologoubenko

Itu benar bahwa itu akan menonaktifkan cache untuk seluruh halaman dan telah disebutkan di url saya telah berbagi magento.stackexchange.com/a/93473/9169 . Jika Anda memiliki pendekatan yang berbeda, silakan bagikan sebagai jawaban baru.
amitshree


Solusi yang luar biasa. Bekerja seperti pesona.
Jalpesh Patel

Itu ide yang buruk untuk kinerja. = (
Kirby

15

Penting untuk memahami mengapa Anda tidak ingin memblokir cache. Jika ini dimaksudkan untuk menampilkan beberapa informasi spesifik sesi maka Anda harus melihat ke dalamnya

Salah satu opsi yang tidak direkomendasikan bisa juga kontroler kustom yang mengembalikan beberapa data melalui panggilan ajax (dengan metode POST sehingga tidak akan di-cache).

(!) cacheable = "false" tidak boleh digunakan. Di sini akan mengikuti, MENGAPA tidak:

Blok dengan cacheable = "false" akan membuat seluruh halaman tidak di-cache. Ini tidak digunakan untuk meninju lubang cache. Halaman berikut juga mengatakan ini ( Untuk membuat halaman yang tidak bisa di-cache , tandai semua blok pada halaman itu sebagai tidak bisa di-cache dalam layout menggunakan cacheable = "false" ):

Apa yang dilakukannya adalah modul Varnish / Fastly akan mengirimkan karena nilai atribut ini selalu non-cacheable header.

Ketika kami mengaktifkan cachable = "false" dan saat menggunakan Varnish / Fastly maka header browser berikut header dikirim:

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

Untuk itu dapat di debugged kode caching halaman Magento aktif

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

di mana yang pertama harus mengirim Cache-Control publik dengan TTL dan yang kedua harus mengirim X-Magento-Tag untuk Varnish / Fastly.

Keduanya menggunakan isCacheable () periksa di mana ini selalu mengembalikan FALSE karena cek berikut (periksa apakah dalam tata letak saat ini ada atribut: cacheable = "false"):

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

Ketika kita menghapus cacheable = "false" maka kita mulai mendapatkan isCacheable () memeriksa sebagai TRUE dan juga mendapatkan header dengan benar di halaman 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

Saya telah membuat non-cacheableblok Harga

<?php

namespace Custom\Module\Block\Pricing\Render;

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

    public function getCacheLifetime()
    {
        return null;
    }

}

Bagaimana Anda mengganti FinalPriceBox dengan ExtendPriceBox menggunakan di.xml?
siddhesh

Ya menggunakandi.xml
Pengembang

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.