Випуск кешування блоку 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>

Однак після завантаження первинної сторінки, кожна наступна сторінка завантажує вміст неправильно. Це виглядає приблизно так:

<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 блоки повернули один і той же вміст, хоча ідентифікатори вказують на різні блоки бази даних. Коли очищається кеш-пам'ять, повертається блок інколи зміниться, але всі три віджети все одно матимуть однаковий вміст.


ви змогли вирішити це для віджетів?
Сергій Гук

У мене насправді не було цієї проблеми, так що ні, але схоже, що у Mage_Cms_Block_Widget_Block може бути однакова проблема, і тому те саме рішення
Ендрю Кетт

Відповіді:


5

Добре, тому я знайшов причину цієї проблеми, і здається, це проблема в основному магенто.

До Mage_Cms_Block_Block в magento 1.14.2 доданий новий метод _construct, який містить наступний код.

/**
 * 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_Ab абстракт :: getCacheKeyInfo, який використовує назву блоку в макеті. У цьому випадку ми фактично не використовуємо файл xml-макета для додавання блоку, і імені не встановлено. Здається, Magento намагається впоратися з цим, встановивши щось на зразок ANONYMOUS_78 як ім'я. Однак чомусь це, здається, не працює на 100%, отже, дублікати, які я бачив.

Моє рішення полягало в тому, щоб замінити клас Mage_Cms_Block_Block в моєму власному розширенні та додати новий метод для встановлення ключа кеша явно на ідентифікатор блоку, а не на присвоєне значення. Клас виглядає так:

/**
 * 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 кешує статичні блоки. Оскільки в поточній оновленій версії входить ця проблема wierd через кешування статичних блоків, ви можете використовувати мій модуль абсолютно безкоштовно.

Це розширення створено для кращого кешування статичних блоків. Він також враховує, захищений чи ні сайт. Крім того, у розширенні немає жодного основного переписування, що робить цей модуль ще кращим.

Ось ви йдете .

Для кращого огляду розширення ви можете посилатися на цю тему .


0

Ми надали патч для CE, який вирішує це питання. Оскільки EE базується в СЕ, це може застосовуватися і.

Ви можете завантажити цей шлях з моєї суті: https://gist.github.com/tux-rampage/77b286f7973336877f7b

Вниз завантажте суть, розпакуйте його і запустіть у корені magento наступну команду:

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

Перевірте це на інсценувальному середовищі, перш ніж застосовувати його в живій системі!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.