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

レイアウトXMLファイルでcacheable属性falseを設定することにより、ブロックをキャッシュ不可として設定できます。例えば

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

そのようなブロックを含むページはキャッシュされません。

カスタムブロックのキャッシュを無効にする方法も確認してください

編集: 1つでcacheable="false"ページ全体のフルページキャッシュが無効になり、そのレイアウトファイルからのページの読み込みが非常に遅くなります。https://inviqa.com/blog/how-full-page-cache-works-magento-2を確認してください


20
これは非常に不適切です。1つのcacheable = "false"でページ全体のフルページキャッシュが無効になり、そのレイアウトファイルからのページの取得が非常に遅くなります。
ドミトリSologoubenko 16年

ページ全体のキャッシュを無効にし、magento.stackexchange.com / a / 93473/9169で共有したURLで既に言及されていることは正しいことです。別のアプローチがある場合は、新しい回答として自由に共有してください。
-amitshree

この記事、素晴らしい説明を読んでください:inviqa.com/blog/how-full-page-cache-works-magento-2
Dmitri Sologoubenko

素晴らしいソリューション。魅力のように働きます。
Jalpesh Patel

これはパフォーマンスにとって悪い考えです。=(
カービー

15

ブロックをキャッシュしたくない理由を理解することが重要です。これがセッション固有の情報を表示することを意図している場合は、

推奨されないオプションの1つは、ajax呼び出しでデータを返すカスタムコントローラーでもあります(POSTメソッドを使用して、キャッシュされません)。

(!)cacheable = "false"は使用しないでください。次のようになります。

cacheable = "false"のブロックは、ページ全体をキャッシュ解除します。キャッシュホールパンチングには使用されません。また、次のページにこれが記載されています(キャッシュ不可能なページ作成するには、キャッシュ可能= "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

最初は、TTLを使用してパブリックCache-Controlを送信し、2番目はVarnish / FastlyのX-Magento-Tagを送信する必要があります。

両方とも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;
    }

}

di.xmlを使用してFinalPriceBoxをExtendPriceBoxにどのように置き換えましたか?
siddhesh

はい使用中di.xml
リードデベロッパー

0

キャッシュできないブロックは、カスタムページにのみ追加できます。それ以外の場合、magento Page Cacheはこれらのページでは機能しません。または、ajax(magentoセクションリクエスト)を介してブロック内の情報を更新します。

ここで説明されているいくつかのことhttps://mirasvit.com/blog/magento-2-page-cache-coverage-rate.html

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.