Sự cố bộ đệm khối CMS trong EE 1.14.2


15

Tôi có một vấn đề dường như liên quan đến bộ nhớ đệm của các khối tĩnh CMS.

Tôi có một trang cms và trong trang đó tôi đang hiển thị một số khối tĩnh cms. Một phiên bản đơn giản hóa của nội dung trang CMS trông như thế này:

<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>

Trang tải như mong đợi ngay lập tức sau khi xóa bộ đệm ẩn, trang đó trông giống như thế này:

<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>

Tuy nhiên, sau khi tải trang inital, mọi trang tải tiếp theo nội dung không chính xác. Nó trông như thế này:

<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>

Trong ví dụ thứ hai, bạn có thể thấy hai quảng cáo đầu tiên là chính xác, tuy nhiên mọi thứ sau đó đang hiển thị nội dung sai cho block_id. Ngoài ra, chặn promo_home_1_1 và promo_home_1_2 đều được hiển thị hai lần và promo_home_3_1 và promo_home_3_2 không bao giờ được hiển thị. Nó giống như ánh xạ giữa block_id và nội dung khối tĩnh liên quan của nó đang bị trộn lẫn bằng cách nào đó. Điều này có liên quan đến bộ nhớ đệm vì nếu bộ đệm khối không được bật thì tôi không còn thấy vấn đề nữa.

Ngoài ra, có lẽ đáng lưu ý rằng trang này đã từng hoạt động trên EE 1.13, tuy nhiên sau khi nâng cấp lên EE 1.14.2, sự cố này đã bắt đầu xảy ra.

Tôi nhận ra khá khó để nói những gì sai mà không biết những gì khác đang xảy ra trong hệ thống nhưng tôi hy vọng ai đó có thể có thể cho tôi ít nhất một số hướng ở đây khi tôi hết ý tưởng.

Cập nhật:

Tôi cũng đã thử điều này với các widget, vd

<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>

Trong trường hợp này, cả 3 khối đều trả về cùng một nội dung mặc dù các id đang trỏ đến các khối khác nhau trong cơ sở dữ liệu. Khi xóa bộ đệm, khối được trả về đôi khi sẽ thay đổi, nhưng cả ba widget vẫn sẽ có cùng một nội dung.


bạn có thể giải quyết nó cho Widgets không?
Sergei Guk

Tôi thực sự không có vấn đề đó nên không, nhưng có vẻ như Mage_Cms_Block_Widget_Block có thể có cùng một vấn đề và do đó, cùng một giải pháp
Andrew Kett

Câu trả lời:


5

Ok vì vậy tôi đã tìm ra nguyên nhân của vấn đề này và nó dường như là một vấn đề trong lõi magento.

Có một phương thức _construct mới được thêm vào Mage_Cms_Block_Block trong magento 1.14.2 chứa mã sau đây.

/**
 * 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);
}

Điều này có hiệu quả bật bộ nhớ đệm cho các khối cms. Không có khóa bộ đệm nào được đặt để nó rơi trở lại Mage_Core_Block_Abauge :: getCacheKeyInfo sử dụng tên của khối trong bố cục. Trong trường hợp này, chúng tôi không thực sự sử dụng tệp xml bố cục để thêm khối và không có tên được đặt. Magento dường như cố gắng xử lý việc này bằng cách đặt tên như ANONYMOUS_78 làm tên. Tuy nhiên vì một số lý do, điều này dường như không hoạt động 100% do đó các bản sao tôi đang thấy.

Giải pháp của tôi là ghi đè lớp Mage_Cms_Block_Block trong tiện ích mở rộng của riêng tôi và thêm một phương thức mới để đặt khóa bộ đệm một cách rõ ràng vào id khối thay vì giá trị được gán. Lớp học trông như thế này:

/**
 * 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();
        }
    }
}

Điều này dường như đã giải quyết vấn đề.

Cập nhật:

Có vẻ như vấn đề tương tự này cũng tồn tại trong CE 1.9.2


2

Đối với Khách hàng Magento EE, vui lòng yêu cầu bản vá SUPEE-5874 từ Nhóm Hỗ trợ Doanh nghiệp Magento.

Nó sẽ cập nhật hai tập tin

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

Tôi không thể đăng bản vá thực tế từ Magento vì đây là tài sản của họ.


1

Thật vui khi ở đây Magento hiện đang lưu trữ các khối tĩnh. Vì phiên bản nâng cấp hiện tại bao gồm vấn đề nghiêm trọng hơn do bộ đệm của các khối tĩnh, bạn có thể sử dụng mô-đun của tôi hoàn toàn miễn phí.

Phần mở rộng này được tạo để lưu trữ tốt hơn các khối tĩnh. Nó cũng đưa vào xem xét liệu trang web có được bảo mật hay không. Ngoài ra, phần mở rộng không có bất kỳ phần viết lại cốt lõi nào, điều này làm cho mô-đun này thậm chí còn tốt hơn.

Ở đây bạn đi .

Để biết tổng quan tốt hơn về phần mở rộng, bạn có thể tham khảo chủ đề này .


0

Chúng tôi đã cung cấp một bản vá cho CE, giải quyết vấn đề này. Vì EE có trụ sở tại CE, điều này cũng có thể áp dụng.

Bạn có thể tải xuống đường dẫn này từ ý chính của tôi: https://gist.github.com/tux-rampage/77b286f7973336877f7b

Tải xuống ý chính, giải nén nó và chạy lệnh sau trong root magento của bạn:

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

Kiểm tra điều này trên một môi trường dàn dựng trước khi áp dụng nó trên một hệ thống sống!

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.