Magento 2에서 블록의 캐시를 비활성화하는 방법은 무엇입니까?


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

    public function getCacheKeyInfo()
    {
        return [];
    }

작동하지 않습니다. 왜? 블록 캐시를 비활성화하는 방법은 무엇입니까?


블록이 캐시 된 다른 블록 안에 있다고 생각합니다. 예를 들어 바닥 글 블록 출력이 캐시되므로 바닥 글 블록에 넣은 모든 내용이 캐시됩니다.
Smartie 2019

@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" />

이러한 블록을 포함하는 페이지는 캐시되지 않습니다.

또한 사용자 정의 블록의 캐싱을 비활성화하는 방법을 확인하십시오.

편집 : 단일 cacheable="false"페이지 전체에 대해 전체 페이지 캐싱을 비활성화하여 해당 레이아웃 파일에서 페이지 소싱을 매우 느리게 만듭니다! https://inviqa.com/blog/how-full-page-cache-works-magento-2 확인


20
이것은 매우 부적절합니다. 단일 cacheable = "false"는 전체 페이지에 대해 전체 페이지 캐싱을 비활성화하여 해당 레이아웃 파일에서 페이지 소싱을 매우 느리게 만듭니다!
Dmitri Sologoubenko

전체 페이지에 대해 캐시를 비활성화하고 이미 magento.stackexchange.com/a/93473/9169를 공유 한 URL에서 언급 한 것이 맞습니다 . 다른 접근법을 사용하는 경우 새로운 답변으로 자유롭게 공유하십시오.
amitshree 2016


멋진 해결책. 매력처럼 작동합니다.
Jalpesh Patel

그것은 성능에 대한 나쁜 생각입니다. = (
Kirby

15

블록을 캐시하지 않으려는 이유를 이해하는 것이 중요합니다. 이것이 세션 특정 정보를 보여주기위한 것이라면

권장되지 않는 옵션 중 하나는 ajax-call을 통해 일부 데이터를 반환하는 사용자 정의 컨트롤러 일 수 있습니다 (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

여기서 첫 번째는 TTL과 함께 공개 Cache-Control을 전송하고 두 번째는 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
Lead Developer

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.