Magento 2'deki bloğun önbelleği nasıl devre dışı bırakılır?


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

    public function getCacheKeyInfo()
    {
        return [];
    }

çalışmıyor. Niye ya? Blok için önbellek nasıl devre dışı bırakılır?


Senin bloğunun da önbelleğe alınmış başka bir bloğun içinde olduğundan şüpheleniyorum. Örneğin, altbilgi bloğunun içine koyduğunuz her şey önbelleklenir, çünkü altbilgi bloğu çıktısı önbelleğe alınır.
Smartie

@Smartie beni nasıl kapatabilirim? <referenceContainer name = "content"> <block class = "class" template = "block.phtml" önce = "product.info.main" /> </referenceContainer>
gebuket

Yanıtlar:


27

Mizanpaj XML dosyalarında cacheablenitelik ayarlanarak bloklar önbelleksiz olarak ayarlanabilir falseÖrneğin

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

Bu tür blokları içeren sayfalar önbelleğe alınmaz.

Ayrıca , Özel bloğun önbelleğe alınmasını nasıl devre dışı bırakacağınızı

Düzenleme: Tek bir cacheable="false"son derece yavaş o düzen dosyasından kaynak sayfaları kılarak bütün sayfa için Tam Sayfa Caching devre dışı bırakır! Https://inviqa.com/blog/how-full-page-cache-works-magento-2 adresini kontrol edin.


20
Bu çok uygunsuz, tek bir önbelleklenebilir = "false", tüm sayfa için Tam Sayfa Önbelleğe Alma özelliğini devre dışı bırakarak, bu düzen dosyasından kaynaklanan sayfaları çok yavaşlatır!
Dmitri Sologoubenko

Tüm sayfa için önbelleği devre dışı bırakacağı ve daha önce magento.stackexchange.com/a/93473/9169 paylaştığım url’de belirtildiği doğru . Farklı bir yaklaşımınız varsa, bunu yeni bir cevap olarak paylaşmaktan çekinmeyin.
amitshree


Müthiş bir çözüm. Cazibe gibi çalış.
Jalpesh Patel

Bu performans için kötü bir fikir. = (
Kirby,

15

Neden blok önbelleğe almak istemediğinizi anlamak önemlidir. Bunun oturuma özel bilgileri göstermesi gerekiyorsa, aramanız gerekenler

Tavsiye edilmeyen seçeneklerden biri, ajax çağrısı üzerinden bazı verileri döndüren özel denetleyici de olabilir (POST yöntemiyle önbelleğe alınmaması için).

(!) cacheable = "false" kullanılmamalıdır. İşte takip edecek, NEDEN:

Önbelleğe alınabilir = "false" olan bir blok tüm sayfayı önbelleğe almaz. Önbellek delme işlemi için kullanılmaz. Ayrıca aşağıdaki sayfa, bu (diyor etmek önbelleğe alınmaz bir sayfa oluşturmak , Cacheable kullanarak düzeninde uncacheable gibi o sayfada herhangi bloğunu işaretlemek = "false" ):

Bu, Varnish / Fastly modüllerinin her zaman önbelleğe alınamayan başlıkların bu nitelik değeri nedeniyle gönderileceğidir.

Cachable = "false" u etkinleştirdiğimizde ve Varnish / Fastly kullanırken tarayıcı başlığından sonraki tarayıcı tarafı gönderilir:

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

Bunun için Magento'nun sayfa önbelleğe alma kodunda hata ayıklanabilir.

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

Birincisi TTL'li genel Cache-Control göndermeli ve ikincisi Varnish / Fastly için X-Magento-Tags göndermeli.

Her ikisi de isCacheable () kontrolünü kullanarak bunun her zaman FALSE değerini döndürdüğü yeri kontrol edin (şu anki düzende herhangi bir öznitelik olup olmadığını kontrol edin: cacheable = "false"):

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

Cacheable = "false" i kaldırdığımızda isCacheable (), TRUE olarak denetler ve start / / category- / productpages başlıklarını doğru bir şekilde alırız.

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-cacheableFiyatlandırma bloğu için yaptım

<?php

namespace Custom\Module\Block\Pricing\Render;

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

    public function getCacheLifetime()
    {
        return null;
    }

}

FinalPriceBox'ı di.xml kullanarak ExtendPriceBox ile nasıl değiştirdiniz?
siddhesh

Evetdi.xml
Kurşun Geliştirici

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.