Problema di memorizzazione nella cache del blocco CMS in EE 1.14.2


15

Ho un problema che sembra essere correlato alla memorizzazione nella cache dei blocchi statici CMS.

Ho una pagina cms e all'interno di quella pagina sto eseguendo il rendering di un numero di blocchi statici cms. Una versione semplificata del contenuto della pagina CMS è simile alla seguente:

<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 pagina si carica come previsto immediatamente dopo che la cache dei blocchi è stata cancellata, quella pagina ha un aspetto simile al seguente:

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

Tuttavia, dopo il caricamento della pagina iniziale, ogni pagina successiva carica il contenuto non è corretto. Sembra così:

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

Nel secondo esempio puoi vedere che le prime due promozioni sono corrette, tuttavia tutto ciò che segue mostra il contenuto errato per block_id. Inoltre, il blocco promo_home_1_1 e promo_home_1_2 vengono entrambi riprodotti due volte e promo_home_3_1 e promo_home_3_2 non vengono mai resi. È come se il mapping tra block_id e il relativo contenuto di blocco statico associato venisse mischiato in qualche modo. Ciò è correlato alla memorizzazione nella cache come se la cache dei blocchi non fosse abilitata, quindi non vedo più il problema.

Inoltre, probabilmente vale la pena notare che questa pagina funzionava su EE 1.13, tuttavia dopo l'aggiornamento a EE 1.14.2 questo problema ha iniziato a verificarsi.

Mi rendo conto che è piuttosto difficile dire cosa c'è che non va senza sapere cos'altro sta succedendo nel sistema, ma spero che qualcuno possa essere in grado di darmi almeno qualche altra direzione qui mentre sto esaurendo le idee.

Aggiornare:

Ho anche provato questo con i widget, ad es

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

In questo caso tutti e 3 i blocchi hanno restituito lo stesso contenuto anche se gli ID indicano blocchi diversi nel database. Quando la cache viene cancellata, il blocco restituito a volte cambia, ma tutti e tre i widget avranno comunque lo stesso contenuto.


sei riuscito a risolverlo per i widget?
Sergei Guk,

In realtà non ho avuto quel problema, quindi no, ma sembra che Mage_Cms_Block_Widget_Block potrebbe avere lo stesso problema e quindi la stessa soluzione
Andrew Kett,

Risposte:


5

Ok, quindi ho trovato la causa di questo problema e sembra essere un problema nel core magento.

C'è un nuovo metodo _construct aggiunto a Mage_Cms_Block_Block in magento 1.14.2 che contiene il seguente codice.

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

Questo sta effettivamente attivando la memorizzazione nella cache per i blocchi cms. Non è stata impostata alcuna chiave cache, quindi ricade in Mage_Core_Block_Abstract :: getCacheKeyInfo che utilizza il nome del blocco nel layout. In questo caso non stiamo effettivamente utilizzando un file xml di layout per aggiungere il blocco e non è stato impostato alcun nome. Magento sembra provare a gestirlo impostando qualcosa come ANONYMOUS_78 come nome. Tuttavia, per qualche motivo, questo non sembra funzionare al 100%, quindi i duplicati che stavo vedendo.

La mia soluzione era quella di sovrascrivere la classe Mage_Cms_Block_Block nella mia estensione e aggiungere un nuovo metodo per impostare esplicitamente la chiave cache sull'id blocco anziché un valore assegnato. La classe si presenta così:

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

Questo sembra aver risolto il problema.

Aggiornare:

Sembra che questo stesso problema esista anche in CE 1.9.2


2

Per i clienti EE Magento, richiedere la patch SUPEE-5874 al team di supporto di Magento Enterprise.

Aggiornerà due file

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

Non riesco a pubblicare la patch reale di Magento in quanto è di loro proprietà.


1

È lieto che Magento stia ora memorizzando nella cache anche blocchi statici. Poiché l'attuale versione aggiornata include questo strano problema a causa della memorizzazione nella cache di blocchi statici, è possibile utilizzare il mio modulo in modo assolutamente gratuito.

Questa estensione è stata creata per una migliore memorizzazione nella cache dei blocchi statici. Tiene inoltre conto del fatto che il sito sia protetto o meno. Inoltre, l'estensione non ha riscritture core, il che rende questo modulo ancora migliore.

Qui si va .

Per una migliore panoramica dell'estensione, puoi fare riferimento a questa discussione .


0

Abbiamo fornito una patch per CE, che risolve questo problema. Poiché EE ha sede in CE, questo potrebbe valere anche per questo.

Puoi scaricare questo percorso dalla mia idea: https://gist.github.com/tux-rampage/77b286f7973336877f7b

Scarica il gist, scompattalo ed esegui il comando seguente nella tua radice magento:

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

Prova questo su un ambiente di gestione temporanea prima di applicarlo su un sistema live!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.