Проблема с кэшированием блоков 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

Итак, я нашел причину этой проблемы, и это, кажется, проблема в ядре magento.

В magento 1.14.2 добавлен новый метод _construct, добавленный в Mage_Cms_Block_Block, который содержит следующий код.

/**
 * 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 в моем собственном расширении и добавить новый метод для явной установки ключа кэша для идентификатора блока, а не для присвоенного значения. Класс выглядит так:

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

Мы предоставили патч для CE, который решает эту проблему. Так как EE основан на CE, это может также применяться.

Вы можете скачать этот путь из моей суть: https://gist.github.com/tux-rampage/77b286f7973336877f7b

Загрузите gist, распакуйте его и выполните следующую команду в вашем magento root:

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

Протестируйте это в промежуточной среде, прежде чем применять его в реальной системе!

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.