จะปิดการใช้งานแคชสำหรับบล็อกใน Magento 2 ได้อย่างไร?


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

    public function getCacheKeyInfo()
    {
        return [];
    }

ไม่สำเร็จ. ทำไม? จะปิดการใช้งานแคชสำหรับบล็อกได้อย่างไร?


ฉันสงสัยว่าบล็อกของคุณอยู่ในบล็อกอื่นที่ถูกแคชไว้ด้วย ตัวอย่างเช่นสิ่งที่คุณใส่ไว้ในบล็อกส่วนท้ายจะถูกแคชเนื่องจากเอาต์พุตบล็อกส่วนท้ายจะถูกแคช
Smartie

@ Smartie วิธีการปิดฉันได้อย่างไร <referenceContainer name = "content"> <block class = "class" template = "block.phtml" before = "product.info.main" /> </referenceContainer>
gebuket

คำตอบ:


27

บล็อกสามารถตั้งค่าเป็นไม่สามารถแคชได้โดยการตั้งค่าcacheableคุณลักษณะfalseในไฟล์ XML โครงร่าง ตัวอย่างเช่น

<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

ถูกต้องแล้วว่าจะปิดการใช้งานแคชสำหรับทั้งหน้าและพูดถึงใน URL ที่ฉันแบ่งปันไว้แล้วmagento.stackexchange.com/a/93473/9169 หากคุณมีวิธีการที่แตกต่างกันอย่าลังเลที่จะแบ่งปันมันเป็นคำตอบใหม่
amitshree

อ่านบทความนี้คำอธิบายที่ดี: inviqa.com/blog/how-full-page-cache-works-magento-2
Dmitri Sologoubenko

ทางออกที่ดีเลิศ ทำงานเหมือนจับใจ
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

สำหรับสิ่งที่สามารถ debugged รหัสแคชหน้าของวีโอไอพี

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

โดยที่อันแรกควรส่งการควบคุมแคชสาธารณะด้วย TTL และอันดับที่สองควรส่ง X-Magento-Tags สำหรับ Varnish / Fastly

ทั้งคู่กำลังใช้ 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;
    }

}

คุณแทนที่ FinalPriceBox ด้วย ExtendPriceBox โดยใช้ di.xml ได้อย่างไร
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.