Làm cách nào để tắt bộ đệm cho khối trong Magento 2?


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

    public function getCacheKeyInfo()
    {
        return [];
    }

không hoạt động. Tại sao? Làm thế nào để vô hiệu hóa bộ đệm cho khối?


Tôi nghi ngờ khối của bạn nằm trong một khối khác cũng được lưu trữ. Ví dụ: mọi thứ bạn đặt bên trong khối chân trang đều được lưu trong bộ đệm vì đầu ra của khối chân trang được lưu trữ.
Smartie

@Smartie làm thế nào để tắt nó đi? <ReferenceContainer name = "content"> <block class = "class" template = "block.phtml" before = "sản phẩm.info.main" /> </
ReferenceContainer

Câu trả lời:


27

Các khối có thể được đặt là không lưu trữ được bằng cách đặt cacheablethuộc tính falsetrong các tệp XML bố trí. Ví dụ

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

Các trang chứa các khối như vậy không được lưu trữ.

Ngoài ra kiểm tra Làm thế nào để vô hiệu hóa bộ nhớ đệm của khối tùy chỉnh

Chỉnh sửa: Một đơn cacheable="false"sẽ vô hiệu hóa Bộ đệm toàn bộ trang cho toàn bộ trang, khiến cho các trang tìm nguồn từ tệp bố cục đó cực kỳ chậm! Kiểm tra https://inviqa.com/blog/how-full-page-cache-works-magento-2


20
Điều này rất không phù hợp, một bộ nhớ cache duy nhất = "false" sẽ vô hiệu hóa Bộ đệm toàn bộ trang cho toàn bộ trang, khiến các trang tìm nguồn từ tệp bố cục đó cực kỳ chậm!
Dmitri Sologoubenko

Đúng là nó sẽ vô hiệu hóa bộ đệm cho toàn bộ trang và đã được đề cập trong url tôi đã chia sẻ magento.stackexchange.com/a/93473/9169 . Nếu bạn có một cách tiếp cận khác, hãy chia sẻ nó như một câu trả lời mới.
amitshree

Đọc bài viết này, lời giải thích tuyệt vời: inviqa.com/blog/how-full-page-cache-works-magento-2
Dmitri Sologoubenko

Giải pháp tuyệt vời. Làm việc như quyến rũ.
Jalpesh Patel

Đó là một ý tưởng tồi cho hiệu suất. = (
Kirby

15

Điều quan trọng là phải hiểu lý do tại sao bạn không muốn chặn bộ đệm. Nếu điều này có nghĩa là hiển thị một số thông tin cụ thể về phiên thì bạn nên xem xét

Một tùy chọn không được đề xuất cũng có thể là bộ điều khiển tùy chỉnh trả về một số dữ liệu qua cuộc gọi ajax (với phương thức POST để nó không bị lưu vào bộ đệm).

(!) cacheable = "false" không được sử dụng. Ở đây sẽ làm theo, TẠI SAO không:

Một khối có bộ nhớ cache = "false" sẽ làm cho toàn bộ trang không bị khóa. Nó không được sử dụng để đục lỗ bộ nhớ cache. Ngoài ra trang sau nói điều này ( Để tạo một trang không thể truy cập , hãy đánh dấu bất kỳ khối nào trên trang đó là không thể truy cập trong bố cục bằng cách sử dụng bộ nhớ cache = "false" ):

Những gì nó làm là các mô-đun Varnish / Fastly sẽ được gửi do giá trị thuộc tính này luôn luôn là các tiêu đề không lưu trong bộ nhớ cache.

Khi chúng tôi kích hoạt bộ nhớ cache = "false" và trong khi sử dụng Varnish / Nhanh chóng thì các tiêu đề phía sau trình duyệt sẽ được gửi:

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

Để có thể gỡ lỗi mã bộ nhớ cache trang của Magento trên

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

trong đó cái đầu tiên sẽ gửi Kiểm soát bộ nhớ cache công khai với TTL và thứ hai sẽ gửi X-Magento-Tags cho Varnish / Fastly.

Cả hai đều đang sử dụng kiểm tra isCachizable () trong đó kiểm tra này luôn trả về FALSE do kiểm tra sau (kiểm tra xem trong bố cục hiện tại có bất kỳ thuộc tính nào không: cacheable = "false"):

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

Khi chúng tôi xóa bộ nhớ cache = "false" thì chúng tôi bắt đầu nhận các kiểm tra isCachizable () là TRUE và cũng nhận được các tiêu đề chính xác trên các trang bắt đầu- / category- / sản phẩm.

X-Magento-Cache-Control:max-age=86400, public, s-maxage=86400
X-Magento-Cache-Debug:HIT
X-Magento-Cache-Hits:1
Age:32

8

Tôi đã thực hiện non-cacheablecho Khối giá

<?php

namespace Custom\Module\Block\Pricing\Render;

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

    public function getCacheLifetime()
    {
        return null;
    }

}

Làm thế nào bạn thay thế FinalpriceBox bằng ExtendpriceBox bằng di.xml?
siddhesh

Có bằng cách sử dụngdi.xml
Nhà phát triển chính

0

Bạn chỉ có thể thêm khối không lưu vào bộ nhớ cache vào các trang tùy chỉnh. Trong trường hợp khác, bộ đệm trang magento sẽ không hoạt động cho các trang này HOẶC cập nhật thông tin trong khối thông qua ajax (yêu cầu phần magento).

Một số điều được mô tả ở đây https://mirasvit.com/blog/magento-2-page-cache-coverage-rate.html

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.