Masalah caching blok CMS di EE 1.14.2

15

Saya punya masalah yang tampaknya terkait dengan caching blok statis CMS.

Saya memiliki halaman cms dan di dalam halaman itu saya membuat sejumlah blok statis cms. Versi sederhana dari konten halaman CMS terlihat seperti ini:

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

Halaman dimuat seperti yang diharapkan segera setelah cache blok dihapus, halaman itu terlihat seperti ini:

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

Namun setelah halaman inital dimuat, setiap halaman berikutnya memuat konten tidak benar. Ini terlihat seperti ini:

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

Pada contoh kedua Anda dapat melihat dua promo pertama sudah benar, namun semuanya setelah itu menampilkan konten yang salah untuk block_id. Juga, blok promo_home_1_1 dan promo_home_1_2 keduanya diberikan dua kali dan promo_home_3_1 dan promo_home_3_2 tidak pernah diberikan. Ini seperti pemetaan antara block_id dan konten blok statis yang terkait sedang tercampur entah bagaimana. Ini terkait dengan caching seolah-olah blok cache tidak diaktifkan maka saya tidak lagi melihat masalahnya.

Juga, mungkin perlu dicatat bahwa halaman ini dulu berfungsi pada EE 1.13, namun setelah memutakhirkan ke EE 1.14.2 masalah ini sudah mulai terjadi.

Saya menyadari sangat sulit untuk mengatakan apa yang salah tanpa mengetahui apa lagi yang terjadi dalam sistem, tetapi saya berharap seseorang mungkin dapat memberi saya setidaknya beberapa arah lagi di sini karena saya kehabisan ide.

Memperbarui:

Saya juga mencoba ini dengan widget, mis

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

Dalam hal ini ketiga blok mengembalikan konten yang sama walaupun id menunjuk ke blok yang berbeda dalam database. Ketika cache dihapus, blok yang dikembalikan terkadang akan berubah, tetapi ketiga widget masih akan memiliki konten yang sama.

Andrew Kett
sumber
apakah Anda dapat menyelesaikannya untuk Widget?
Sergei Guk
Saya sebenarnya tidak memiliki masalah itu, jadi tidak, tetapi sepertinya Mage_Cms_Block_Widget_Block mungkin memiliki masalah yang sama dan oleh karena itu solusi yang sama
Andrew Kett

Jawaban:

5

Ok jadi saya telah menemukan penyebab masalah ini dan sepertinya menjadi masalah di core magento.

Ada metode _construct baru yang ditambahkan ke Mage_Cms_Block_Block di magento 1.14.2 yang berisi kode berikut.

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

Ini secara efektif menyalakan caching untuk blok cms. Tidak ada kunci cache yang diatur sehingga jatuh kembali ke Mage_Core_Block_Abstract :: getCacheKeyInfo yang menggunakan nama blok dalam tata letak. Dalam hal ini kita sebenarnya tidak menggunakan file layout xml untuk menambahkan blok dan tidak ada set nama. Magento tampaknya mencoba dan menangani ini dengan menetapkan sesuatu seperti ANONYMOUS_78 sebagai namanya. Namun untuk beberapa alasan ini sepertinya tidak berfungsi 100% maka duplikat yang saya lihat.

Solusi saya adalah menimpa kelas Mage_Cms_Block_Block di ekstensi saya sendiri dan menambahkan metode baru untuk mengatur kunci cache secara eksplisit ke id blok daripada nilai yang ditugaskan. Kelasnya terlihat seperti ini:

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

Ini sepertinya telah menyelesaikan masalah.

Memperbarui:

Sepertinya masalah yang sama juga ada di CE 1.9.2

Andrew Kett
sumber
2

Untuk Pelanggan Magento EE, silakan minta tambalan SUPEE-5874 dari Tim Dukungan Magento Enterprise.

Ini akan memperbarui dua file

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

Saya tidak dapat memposting tambalan yang sebenarnya dari Magento karena ini milik mereka.

kab8609
sumber
1

Senang di sini bahwa Magento sekarang men-cache blok statis juga. Karena versi yang ditingkatkan saat ini mencakup masalah aneh ini karena cache dari blok statis, Anda dapat menggunakan modul saya secara gratis.

Ekstensi ini dibuat untuk cache yang lebih baik dari blok statis. Ini juga mempertimbangkan apakah situs diamankan atau tidak. Juga ekstensi tidak memiliki penulisan ulang inti, yang membuat modul ini lebih baik.

Di sini Anda pergi .

Untuk ikhtisar ekstensi yang lebih baik, Anda dapat merujuk utas ini .

Rajeev K Tomy
sumber
0

Kami telah menyediakan tambalan untuk CE, yang menyelesaikan masalah ini. Karena EE berbasis di CE, ini mungkin berlaku juga.

Anda dapat mengunduh jalur ini dari intisari saya: https://gist.github.com/tux-rampage/77b286f7973336877f7b

Turunkan inti, bongkar, dan jalankan perintah berikut di root magento Anda:

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

Uji ini pada lingkungan pementasan sebelum menerapkannya pada sistem langsung!

tux-mengamuk
sumber