Problema de armazenamento em cache do bloco CMS no EE 1.14.2

15

Eu tenho um problema que parece estar relacionado ao cache de blocos estáticos do CMS.

Eu tenho uma página cms e dentro dessa página estou processando vários blocos estáticos cms. Uma versão simplificada do conteúdo da página do CMS é semelhante a esta:

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

A página é carregada conforme o esperado imediatamente após a limpeza do cache do bloco, com a seguinte aparência:

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

No entanto, após o carregamento inicial da página, todas as páginas subsequentes carregam o conteúdo incorreto. Se parece com isso:

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

No segundo exemplo, você pode ver as duas primeiras promoções estão corretas, mas tudo depois disso está exibindo o conteúdo errado para o block_id. Além disso, os blocos promo_home_1_1 e promo_home_1_2 são renderizados duas vezes e promo_home_3_1 e promo_home_3_2 nunca são renderizados. É como se o mapeamento entre block_id e seu conteúdo estático de bloco associado estivesse sendo misturado de alguma forma. Isso está relacionado ao armazenamento em cache, como se o cache do bloco não estivesse ativado, e não vejo mais o problema.

Além disso, provavelmente vale a pena notar que esta página funcionava no EE 1.13, mas após a atualização para o EE 1.14.2, esse problema começou a ocorrer.

Percebo que é muito difícil dizer o que há de errado sem saber o que mais está acontecendo no sistema, mas espero que alguém possa me dar pelo menos um pouco mais de orientação aqui, pois estou ficando sem ideias.

Atualizar:

Eu também tentei isso com widgets, por exemplo

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

Nesse caso, todos os três blocos retornaram o mesmo conteúdo, embora os IDs apontem para blocos diferentes no banco de dados. Quando o cache é limpo, o bloco retornado às vezes muda, mas os três widgets ainda terão o mesmo conteúdo.

Andrew Kett
fonte
você conseguiu resolvê-lo para Widgets?
Sergei Guk
Eu realmente não tenho esse problema de modo nenhum, mas parece que Mage_Cms_Block_Widget_Block pode ter o mesmo problema e, portanto, mesma solução
Andrew Kett

Respostas:

5

Ok, então eu encontrei a causa deste problema e parece ser um problema no núcleo magento.

Há um novo método _construct adicionado ao Mage_Cms_Block_Block no magento 1.14.2, que contém o seguinte código.

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

Isso está ativando ativamente o armazenamento em cache para blocos cms. Nenhuma chave de cache está definida; portanto, ela retorna ao Mage_Core_Block_Abstract :: getCacheKeyInfo, que usa o nome do bloco no layout. Nesse caso, não estamos usando um arquivo xml de layout para adicionar o bloco e não há um nome definido. O Magento parece tentar lidar com isso definindo algo como ANONYMOUS_78 como o nome. No entanto, por algum motivo, isso não parece funcionar 100%, portanto, as duplicatas que eu estava vendo.

Minha solução foi substituir a classe Mage_Cms_Block_Block em minha própria extensão e adicionar um novo método para definir explicitamente a chave de cache para o ID do bloco, em vez de um valor atribuído. A classe fica assim:

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

Isso parece ter resolvido o problema.

Atualizar:

Parece que esse mesmo problema também existe no CE 1.9.2

Andrew Kett
fonte
2

Para clientes Magento EE, solicite o patch SUPEE-5874 da equipe de suporte do Magento Enterprise.

Ele atualizará dois arquivos

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

Não consigo postar o patch real do Magento, pois é propriedade deles.

kab8609
fonte
1

É bom aqui que o Magento também esteja armazenando em cache blocos estáticos também. Como a versão atualizada atual inclui esse problema estranho devido ao armazenamento em cache de blocos estáticos, você pode usar meu módulo de forma totalmente gratuita.

Esta extensão foi criada para melhor armazenamento em cache de blocos estáticos. Também leva em consideração se o site está protegido ou não. Além disso, a extensão não possui reescritas principais, o que torna este módulo ainda melhor.

Aqui você vai .

Para uma melhor visão geral da extensão, você pode consultar este tópico .

Rajeev K Tomy
fonte
0

Fornecemos um patch para o CE, que resolve esse problema. Como o EE é baseado no CE, isso também pode se aplicar.

Você pode baixar esse caminho na minha lista: https://gist.github.com/tux-rampage/77b286f7973336877f7b

Carregue a essência, descompacte-a e execute o seguinte comando na raiz do magento:

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

Teste isso em um ambiente de preparação antes de aplicá-lo em um sistema ativo!

tux-rampage
fonte