ปัญหาการแคชบล็อกของ CMS ใน EE 1.14.2


15

ฉันมีปัญหาที่ดูเหมือนว่าจะเกี่ยวข้องกับการแคชของบล็อกคง CMS

ฉันมีหน้า cms ​​และภายในหน้านั้นฉันกำลังแสดงบล็อกแบบคงที่จำนวน cms เนื้อหาหน้า CMS ที่เรียบง่ายมีลักษณะดังนี้:

<div class="cms-block-1">{{block type="cms/block" block_id="banner_home"}}</div> 
<div class="cms-block-2">{{block type="cms/block" block_id="promo_home_1_1"}}</div> 
<div class="cms-block-3">{{block type="cms/block" block_id="promo_home_1_2"}}</div> 
<div class="cms-block-4">{{block type="cms/block" block_id="promo_home_2_1"}}</div> 
<div class="cms-block-5">{{block type="cms/block" block_id="promo_home_2_2"}}</div> 
<div class="cms-block-6">{{block type="cms/block" block_id="promo_home_2_3"}}</div> 
<div class="cms-block-7">{{block type="cms/block" block_id="promo_home_3_1"}}</div> 
<div class="cms-block-8">{{block type="cms/block" block_id="promo_home_3_2"}}</div>

หน้าโหลดตามที่คาดไว้ทันทีหลังจากล้างแคชบล็อกหน้านั้นจะมีลักษณะดังนี้:

<div class="cms-block-1">banner content</div> 
<div class="cms-block-2">promo_home_1_1 content</div> 
<div class="cms-block-3">promo_home_1_2 content</div> 
<div class="cms-block-4">promo_home_2_1 content</div> 
<div class="cms-block-5">promo_home_2_2 content</div> 
<div class="cms-block-6">promo_home_2_3 content</div> 
<div class="cms-block-7">promo_home_3_1 content</div> 
<div class="cms-block-8">promo_home_3_1 content</div>

อย่างไรก็ตามหลังจากโหลดหน้า inital ทุกหน้าในภายหลังโหลดเนื้อหาไม่ถูกต้อง ดูเหมือนว่านี้:

<div class="cms-block-1">banner content</div> 
<div class="cms-block-2">promo_home_1_1 content</div> 
<div class="cms-block-3">promo_home_1_2 content</div> 
<div class="cms-block-4">promo_home_1_1 content</div> 
<div class="cms-block-5">promo_home_1_2 content</div> 
<div class="cms-block-6">promo_home_2_1 content</div> 
<div class="cms-block-7">promo_home_2_2 content</div> 
<div class="cms-block-8">promo_home_2_3 content</div>

ในตัวอย่างที่สองคุณสามารถเห็นโปรโมชันสองรายการแรกนั้นถูกต้องอย่างไรก็ตามทุกอย่างหลังจากนั้นจะแสดงเนื้อหาที่ไม่ถูกต้องสำหรับ block_id นอกจากนี้การบล็อก promo_home_1_1 และ promo_home_1_2 นั้นจะแสดงผลสองครั้งและ promo_home_3_1 และ promo_home_3_2 จะไม่ถูกเรนเดอร์ มันเหมือนกับการทำแผนที่ระหว่าง block_id และเนื้อหาบล็อกคงที่ที่เกี่ยวข้องจะถูกผสมกันอย่างใด สิ่งนี้เกี่ยวข้องกับการแคชราวกับว่าไม่ได้เปิดใช้งานการแคชบล็อกฉันไม่เห็นปัญหาอีกต่อไป

นอกจากนี้อาจเป็นเรื่องที่น่าสังเกตว่าหน้านี้เคยใช้กับ EE 1.13 แต่หลังจากอัปเกรดเป็น EE 1.14.2 ปัญหานี้ได้เริ่มขึ้นแล้ว

ฉันรู้ว่ามันยากที่จะพูดว่าผิดปกติโดยที่ไม่รู้ว่ามีอะไรเกิดขึ้นในระบบ แต่ฉันหวังว่าจะมีใครบางคนสามารถให้ทิศทางฉันได้มากกว่านี้อย่างน้อยตอนที่ฉันหมดความคิด

ปรับปรุง:

ฉันก็ลองทำสิ่งนี้ด้วยวิดเจ็ตเช่น

<div class="cms-block-1">{{widget type="cms/widget_block" template="cms/widget/static_block/default.phtml" block_id="63"}}</div>
<div class="cms-block-2">{{widget type="cms/widget_block" template="cms/widget/static_block/default.phtml" block_id="64"}}</div>
<div class="cms-block-3">{{widget type="cms/widget_block" template="cms/widget/static_block/default.phtml" block_id="65"}}</div>

ในกรณีนี้บล็อกทั้ง 3 รายการส่งคืนเนื้อหาเดียวกันแม้ว่ารหัสจะชี้ไปยังบล็อกต่างๆในฐานข้อมูล เมื่อแคชถูกล้างการบล็อกที่ส่งคืนจะมีการเปลี่ยนแปลงในบางครั้ง แต่วิดเจ็ตทั้งสามจะยังคงมีเนื้อหาเดียวกัน


คุณสามารถแก้ปัญหาให้กับวิดเจ็ตได้หรือไม่?
Sergei Guk

ฉันไม่ได้มีปัญหานั้นจริง ๆ ไม่ แต่ดูเหมือนว่า Mage_Cms_Block_Widget_Block อาจมีปัญหาเดียวกันและวิธีแก้ปัญหาเดียวกัน
Andrew Kett

คำตอบ:


5

ตกลงดังนั้นฉันได้พบสาเหตุของปัญหานี้และดูเหมือนว่าจะมีปัญหาในแกนกลางวีโอไอพี

มีเมธอด _construct ใหม่ที่เพิ่มใน Mage_Cms_Block_Block ใน magento 1.14.2 ซึ่งมีรหัสต่อไปนี้

/**
 * Initialize cache
 *
 * @return null
 */
protected function _construct()
{
    /*
    * setting cache to save the cms block
    */
    $this->setCacheTags(array(Mage_Cms_Model_Block::CACHE_TAG));
    $this->setCacheLifetime(false);
}

นี่เป็นการเปิดการแคชสำหรับบล็อก cms อย่างมีประสิทธิภาพ ไม่มีการตั้งค่าแคชคีย์ดังนั้นจึงกลับไปที่ Mage_Core_Block_Abstract :: getCacheKeyInfo ซึ่งใช้ชื่อบล็อกในโครงร่าง ในกรณีนี้เราไม่ได้ใช้ไฟล์ xml ของเลย์เอาต์เพื่อเพิ่มบล็อกและไม่มีชุดชื่อ Magento ดูเหมือนจะพยายามและจัดการสิ่งนี้โดยตั้งชื่อ ANONYMOUS_78 เป็นชื่อ อย่างไรก็ตามด้วยเหตุผลบางอย่างสิ่งนี้ดูเหมือนจะไม่ทำงาน 100% ดังนั้นข้อมูลซ้ำซ้อนที่ฉันเห็น

โซลูชันของฉันคือการแทนที่คลาส Mage_Cms_Block_Block ในส่วนขยายของฉันเองและเพิ่มวิธีการใหม่เพื่อตั้งค่าแคชคีย์อย่างชัดเจนให้กับ id บล็อกแทนที่จะเป็นค่าที่กำหนด ชั้นเรียนมีลักษณะดังนี้:

/**
 * Override cms/block to add cache key. This started being a problem as of EE 1.14.2 when the _construct
 * method was added which turns on caching for cms blocks
 */
class Mysite_Cms_Block_Block extends Mage_Cms_Block_Block
{

    /**
     * If this block has a block id, use that as the cache key.
     *
     * @return array
     */
    public function getCacheKeyInfo()
    {
        if ($this->getBlockId()) {
            return array(
                Mage_Cms_Model_Block::CACHE_TAG,
                Mage::app()->getStore()->getId(),
                $this->getBlockId(),
                (int) Mage::app()->getStore()->isCurrentlySecure()
            );
        } else {
            return parent::getCacheKeyInfo();
        }
    }
}

ดูเหมือนว่าจะสามารถแก้ไขปัญหาได้

ปรับปรุง:

ดูเหมือนว่าปัญหาเดียวกันนี้ยังมีอยู่ใน CE 1.9.2


2

สำหรับลูกค้า Magento EE โปรดขอแพทช์ SUPEE-5874 จากทีมงานบริการของ Magento Enterprise

มันจะอัปเดตสองไฟล์

app/code/core/Mage/Cms/Block/Widget/Block.php
app/code/core/Mage/Cms/Block/Block.php

ฉันไม่สามารถโพสต์แพตช์จริงจาก Magento ได้เพราะเป็นทรัพย์สินของพวกเขา


1

มีความยินดีเป็นอย่างยิ่งที่ Magento ได้ทำการแคชบล็อกสแตติกด้วยเช่นกัน เนื่องจากเวอร์ชันที่อัปเกรดในปัจจุบันมีปัญหาที่แปลกมากเนื่องจากการแคชบล็อกคงที่คุณสามารถใช้โมดูลของฉันได้ฟรี

ส่วนขยายนี้สร้างขึ้นเพื่อการแคชบล็อกคงที่ที่ดียิ่งขึ้น นอกจากนี้ยังคำนึงถึงว่าไซต์นั้นปลอดภัยหรือไม่ ส่วนขยายไม่มีการแก้ไขหลักใด ๆ ซึ่งทำให้โมดูลนี้ดียิ่งขึ้น

ไปเลย

สำหรับภาพรวมที่ดีขึ้นของส่วนขยายคุณสามารถอ้างอิงชุดข้อความนี้


0

เราได้จัดทำ patch สำหรับ CE ซึ่งช่วยแก้ไขปัญหานี้ เนื่องจาก EE อยู่ใน CE จึงอาจนำไปใช้เช่นกัน

คุณสามารถดาวน์โหลดเส้นทางนี้จากส่วนสำคัญของฉัน: https://gist.github.com/tux-rampage/77b286f7973336877f7b

ดาวน์โหลดสรุปส่วนสำคัญแกะมันและรันคำสั่งต่อไปนี้ในรูทวีโอไอพีของคุณ:

patch -p2 </path/to/LUKA-MCE20150714-cms-caching-hotfix.patch

ทดสอบสิ่งนี้ในสภาพแวดล้อมการจัดเตรียมก่อนนำไปใช้กับระบบจริง!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.