Вопрос

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

Это было полезно?

Решение

ОК, поэтому я нашел причину этой проблемы, и кажется, что проблема в Core Magento.

Есть новый метод _constuct, добавленный в Mage_CMS_BLOCK_BLOCK в Magento 1.14.2, который содержит следующий код.

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

Это, кажется, решило проблему.

<Сильное> Обновление:

Это похоже на эту же проблему также

Другие советы

Для клиентов Magento EE, пожалуйста, запросите патч Supee-5874 из команды поддержки Magento Enterprise.

Это обновит два файла

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

Я не могу опубликовать фактический патч из Magento, как это их свойство.

Рад здесь, что Magento теперь падает статические блоки.Поскольку текущая обновленная версия включает в себя эту странную проблему из-за кэширования статических блоков, вы можете использовать мой модуль для абсолютно бесплатно.

Это расширение создано для лучшего кэширования статических блоков.Это также учитывает, закреплен ли сайт или нет.Также удлинение не имеет никакого ядро переписывает, что делает этот модуль еще лучше.

Здесь вы идете ,

Для лучшего обзора расширения вы можете обратитесь к этой теме .

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

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

down Загрузите гист, распакуйте его и запустите следующую команду в вашем Magento Root:

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с magento.stackexchange
scroll top