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?

gebuket
sumber
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

amitshree
sumber
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
Baca artikel ini, penjelasan yang bagus: inviqa.com/blog/how-full-page-cache-works-magento-2
Dmitri Sologoubenko
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
Elvin Risti
sumber
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;
    }

}
Pengembang Pimpinan
sumber
Bagaimana Anda mengganti FinalPriceBox dengan ExtendPriceBox menggunakan di.xml?
siddhesh
Ya menggunakandi.xml
Pengembang
0

Anda dapat menambahkan hanya blok non-cacheable ke halaman khusus. Dalam kasus lain, Cache Halaman magento tidak akan berfungsi untuk halaman ini ATAU memperbarui informasi dalam blok melalui ajax (permintaan bagian magento).

Beberapa hal yang dijelaskan di sini https://mirasvit.com/blog/magento-2-page-cache-coverage-rate.html

Alex
sumber