Problema de almacenamiento en caché de bloque CMS en EE 1.14.2

15

Tengo un problema que parece estar relacionado con el almacenamiento en caché de bloques estáticos de CMS.

Tengo una página de cms y dentro de esa página estoy representando una serie de bloques estáticos de cms. Una versión simplificada del contenido de la página CMS se ve así:

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

La página se carga como se esperaba inmediatamente después de que se borra el caché de bloques, esa página se ve así:

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

Sin embargo, después de la carga inicial de la página, cada página posterior carga el contenido es incorrecto. Se parece a esto:

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

En el segundo ejemplo, puede ver que las dos primeras promociones son correctas, sin embargo, todo lo que se muestra a continuación muestra el contenido incorrecto para block_id. Además, el bloque promo_home_1_1 y promo_home_1_2 se representan dos veces y promo_home_3_1 y promo_home_3_2 nunca se representan. Es como la asignación entre block_id y su contenido de bloque estático asociado se está mezclando de alguna manera. Esto está relacionado con el almacenamiento en caché, ya que si el bloque de caché no está habilitado, ya no veo el problema.

Además, probablemente valga la pena señalar que esta página solía funcionar en EE 1.13, sin embargo, después de actualizar a EE 1.14.2, este problema comenzó a ocurrir.

Me doy cuenta de que es bastante difícil decir qué está mal sin saber qué más está sucediendo en el sistema, pero espero que alguien pueda darme al menos algo más de dirección aquí, ya que me estoy quedando sin ideas.

Actualizar:

También probé esto con widgets, por ejemplo

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

En este caso, los 3 bloques devolvieron el mismo contenido aunque los identificadores apuntan a diferentes bloques en la base de datos. Cuando se borra el caché, el bloque devuelto a veces cambiará, pero los tres widgets aún tendrán el mismo contenido.

Andrew Kett
fuente
¿Pudiste resolverlo para Widgets?
Sergei Guk
En realidad no tuve ese problema, así que no, pero parece que Mage_Cms_Block_Widget_Block podría tener el mismo problema y, por lo tanto, la misma solución
Andrew Kett

Respuestas:

5

Ok, he encontrado la causa de este problema y parece ser un problema en core magento.

Hay un nuevo método _construct agregado a Mage_Cms_Block_Block en magento 1.14.2 que contiene el siguiente 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);
}

Esto activa efectivamente el almacenamiento en caché para bloques cms. No se establece ninguna clave de caché, por lo que recurre a Mage_Core_Block_Abstract :: getCacheKeyInfo, que utiliza el nombre del bloque en el diseño. En este caso, en realidad no estamos utilizando un archivo xml de diseño para agregar el bloque y no hay un conjunto de nombres. Magento parece tratar de manejar esto estableciendo algo como ANONYMOUS_78 como nombre. Sin embargo, por alguna razón, esto no parece estar funcionando al 100%, por lo tanto, los duplicados que estaba viendo.

Mi solución fue anular la clase Mage_Cms_Block_Block en mi propia extensión y agregar un nuevo método para establecer la clave de caché explícitamente en la identificación del bloque en lugar de un valor asignado. La clase se ve así:

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

Esto parece haber resuelto el problema.

Actualizar:

Parece que este mismo problema también existe en CE 1.9.2

Andrew Kett
fuente
2

Para clientes de Magento EE, solicite el parche SUPEE-5874 al equipo de soporte de Magento Enterprise.

Actualizará dos archivos

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

No puedo publicar el parche real de Magento ya que es de su propiedad.

kab8609
fuente
1

Aquí me alegra que Magento ahora también esté almacenando en caché bloques estáticos. Dado que la versión actualizada actual incluye este extraño problema debido al almacenamiento en caché de bloques estáticos, puede usar mi módulo de forma totalmente gratuita.

Esta extensión se crea para mejorar el almacenamiento en caché de bloques estáticos. También tiene en cuenta si el sitio está protegido o no. Además, la extensión no tiene ninguna reescritura central, lo que hace que este módulo sea aún mejor.

Aquí tiene .

Para una mejor visión general de la extensión, puede consultar este hilo .

Rajeev K Tomy
fuente
0

Hemos proporcionado un parche para CE, que resuelve este problema. Dado que EE se basa en CE, esto también podría aplicarse.

Puede descargar esta ruta desde mi esencia: https://gist.github.com/tux-rampage/77b286f7973336877f7b

Descargue la esencia, descomprímalo y ejecute el siguiente comando en su raíz de magento:

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

¡Pruebe esto en un entorno de ensayo antes de aplicarlo en un sistema en vivo!

escándalo
fuente