Проблема кэширования блоков CMS в EE 1.14.2


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

Author: Andrew Kett, 2015-06-22

4 answers

Хорошо, итак, я нашел причину этой проблемы, и, похоже, это проблема в основном 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

 5
Author: Andrew Kett, 2017-04-13 12:55:02

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

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

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

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

 2
Author: kab8609, 2015-08-03 20:50:09

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

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

Здесь ты иди.

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

 1
Author: Rajeev K Tomy, 2017-04-13 12:55:02

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

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

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

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

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

 0
Author: tux-rampage, 2015-07-20 18:41:31