EE 1.14.2'de CMS engelleme önbelleği sorunu


15

CMS statik bloklarının önbelleğe alınması ile ilgili bir sorun var.

Bir cms sayfa var ve bu sayfa içinde cms statik bloklar bir dizi render. CMS sayfa içeriğinin basitleştirilmiş bir sürümü şöyle görünür:

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

Blok önbellek temizlendikten hemen sonra sayfa beklendiği gibi yüklenir, bu sayfa şöyle görünür:

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

Ancak, başlangıçtaki sayfa yüklendikten sonra, sonraki her sayfa yükleme içeriği yanlış olur. Şöyle görünüyor:

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

İkinci örnekte ilk iki promosyonun doğru olduğunu görebilirsiniz, ancak bundan sonraki her şey block_id için yanlış içerik gösteriyor. Ayrıca, promo_home_1_1 ve promo_home_1_2 bloklarının her ikisi de iki kez oluşturulur ve promo_home_3_1 ve promo_home_3_2 asla oluşturulmaz. Block_id ve ilişkili statik blok içeriği arasındaki eşleme bir şekilde karıştırılıyor. Bu, önbellek engelleme etkin değilse blok önleme ile ilgilidir, o zaman artık sorunu görmüyorum.

Ayrıca, muhtemelen bu sayfanın EE 1.13 üzerinde çalıştığını belirtmek gerekir, ancak EE 1.14.2'ye yükselttikten sonra bu sorun ortaya çıkmaya başlamıştır.

Sistemde başka neler olup bittiğini bilmeden neyin yanlış olduğunu söylemek oldukça zor ama fikirlerin tükenirken birinin burada en azından biraz daha yön verebileceğini umuyorum.

Güncelleme:

Bunu widget'larla da denedim, örn.

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

Bu durumda, kimlikler veritabanındaki farklı bloklara işaret etseler bile 3 bloğun tümü aynı içeriği döndürdü. Önbellek temizlendiğinde, döndürülen blok bazen değişecektir, ancak üç widget'ın tümü de aynı içeriğe sahip olacaktır.


Widget'lar için çözebildiniz mi?
Sergei Guk

Aslında bu sorun yoktu bu yüzden hayır, ama Mage_Cms_Block_Widget_Block aynı sorun ve bu nedenle aynı çözüm olabilir gibi görünüyor
Andrew Kett

Yanıtlar:


5

Tamam bu sorunun nedenini buldum ve çekirdek magento bir sorun gibi görünüyor.

Magento 1.14.2'de Mage_Cms_Block_Block öğesine aşağıdaki kodu içeren yeni bir _construct yöntemi eklenmiştir.

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

Bu etkili bir şekilde cms blokları için önbellek açma. Herhangi bir önbellek anahtarı ayarlanmadığından, mizanpajda bloğun adını kullanan Mage_Core_Block_Abstract :: getCacheKeyInfo öğesine geri döner. Bu durumda, bloğu eklemek için aslında bir düzen xml dosyası kullanmıyoruz ve ayarlanmış bir ad yok. Magento, adı ANONYMOUS_78 gibi bir şey ayarlayarak bunu deniyor gibi görünüyor. Ancak bazı nedenlerden dolayı bu% 100 çalışmıyor gibi görünüyor, bu yüzden gördüğüm kopyalar.

Benim çözüm Mage_Cms_Block_Block sınıfını kendi uzantımda geçersiz kılmak ve önbellek anahtarını atanmış bir değer yerine blok kimliğine açıkça ayarlamak için yeni bir yöntem eklemekti. Sınıf şöyle görünür:

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

Bu sorunu çözmüş görünüyor.

Güncelleme:

Aynı sorun CE 1.9.2'de de var gibi görünüyor


2

Magento EE Müşterileri için lütfen Magento Kurumsal Destek Ekibi'nden SUPEE-5874 yamasını isteyin.

İki dosyayı güncelleyecek

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

Onların mülkiyet olduğu gibi Magento gerçek yama gönderemezsiniz.


1

Magento'nun şimdi de statik blokları önbelleğe alması sevindirdi. Mevcut yükseltilmiş sürüm statik blokların önbelleğe alınması nedeniyle bu garip sorunu içerdiğinden, modülümü tamamen ücretsiz olarak kullanabilirsiniz.

Bu uzantı, statik blokların daha iyi önbelleğe alınması için oluşturulur. Ayrıca sitenin güvenli olup olmadığını da dikkate alır. Ayrıca, uzantının çekirdek yeniden yazma işlemleri yoktur, bu da bu modülü daha da iyi hale getirir.

Buyurun .

Uzantıya daha iyi bir genel bakış için bu konuya başvurabilirsiniz .


0

CE için bu sorunu çözen bir yama sağladık. Enerji Verimliliği CE merkezli olduğundan, bu durum geçerli olabilir.

Bu yolu özgeçmişimden indirebilirsiniz: https://gist.github.com/tux-rampage/77b286f7973336877f7b

Özü aşağı indirin, ambalajından çıkarın ve macenta kökünüzde aşağıdaki komutu çalıştırın:

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

Canlı bir sisteme uygulamadan önce bunu bir hazırlama ortamında test edin!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.