L'aggiornamento della cache di blocco EE 1.14.2 / CE 1.9.2 ha chiavi di cache non univoche: contenuto duplicato visualizzato sul frontend


18

Quando ho eseguito l'aggiornamento a EE 1.14.2, la maggior parte delle cose è andata bene, ma ho riscontrato un problema quando ho iniziato a controllare le mie varie pagine di frontend. Ho un nodo del catalogo con diverse sottocategorie e ognuna di queste ha un diverso blocco statico che mostra su di esse. Dopo l'aggiornamento, qualunque pagina è stata colpita per prima dopo che una svuotamento della cache sarebbe stata mostrata su tutte le diverse pagine.

Non so se questo stesso problema sarà presente quando verrà rilasciato CE 1.9.2, ma volevo mettere la mia soluzione qui per coloro che potrebbero trovare lo stesso problema.

AGGIORNAMENTO: Come confermato qui, lo stesso problema è emerso in CE 1.9.2


Risposte:


11

Dato che si trattava di EE, sono stato in grado di utilizzare il supporto Magento, ma ho anche risolto le cose da solo per aiutare a focalizzare il problema e ottenere una soluzione il più velocemente possibile. Le modifiche al codice sono state fornite da Magento, quindi applicarle ai file app / code / core effettivi va bene anche se puoi sempre duplicare i file nel tuo / app / code / local e applicare le modifiche lì.

Il problema era che il metodo di memorizzazione nella cache dei blocchi aggiunto in 1.14.2 non generava una chiave cache univoca, quindi quando avevo più blocchi utilizzati nello spazio del controller di categoria, la chiave cache generata finiva per essere unica solo per l'hit della prima pagina, risultante in tutte quelle pagine per mostrare contenuti duplicati.

La correzione consisteva nell'aggiungere quanto segue (visualizzato in formato file diff per mostrare il contesto che circonda le aggiunte - basta aggiungere le righe con il + dove devono andare):

In app / code / core / Mage / Cms / Block / Block.php alla riga 72:

         }
         return $html;
     }
+
+    /**
+     * Retrieve values of properties that unambiguously identify unique content
+     *
+     * @return array
+     */
+    public function getCacheKeyInfo()
+    {
+        $blockId = $this->getBlockId();
+        if ($blockId) {
+            $result = array(
+                $blockId,
+                Mage::app()->getStore()->getCode(),
+            );
+        } else {
+            $result = parent::getCacheKeyInfo();
+        }
+        return $result;
+    }
 }

In app / code / core / Mage / Cms / Block / Widget / Block.php alla riga 82:

                 $helper = Mage::helper('cms');
                 $processor = $helper->getBlockTemplateProcessor();
                 $this->setText($processor->filter($block->getContent()));
+                $this->addModelTags($block);
             }
         }

         unset(self::$_widgetUsageMap[$blockHash]);
         return $this;
     }
+
+    /**
+     * Retrieve values of properties that unambiguously identify unique content
+     *
+     * @return array
+     */
+    public function getCacheKeyInfo()
+    {
+        $result = parent::getCacheKeyInfo();
+        $blockId = $this->getBlockId();
+        if ($blockId) {
+            $result[] = $blockId;
+        }
+        return $result;
+    }
 }

Non penso che sarei l'unico a vedere questo problema e se si presenta in CE 1.9.2, spero che questo possa aiutare a risolverlo per alcune persone.


Purtroppo non è arrivato a CE 1.9.2 che è stato rilasciato ieri, quindi ho riscontrato questo problema su uno dei siti Web dei nostri clienti dopo l'aggiornamento. Proverò questa correzione.
Marco Miltenburg,

questo non funziona per me
Pixelomo

10

Penso che nel modo giusto sia necessario creare un modulo personalizzato perché tutti voi sapete che Magento Boogieman vi conquisterà! se cambia il core :)

Sarà necessario i seguenti file: app/etc/modules/Bhupendra_Cms.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Bhupendra_Cms>
            <active>true</active>
            <codePool>local</codePool>
            <depends>
                <Mage_Cms/>
            </depends>
        </Bhupendra_Cms>
    </modules>
</config>

app/code/local/Bhupendra/Cms/etc/config.xml

<?xml version="1.0"?>
<config>
        <modules>
            <Bhupendra_Cms>
                <version>1.0.0</version>
            </Bhupendra_Cms>
        </modules>
        <global>
            <blocks>
                <cms>
                    <rewrite>
                        <block>Bhupendra_Cms_Block_Block</block>
                        <widget_block>Bhupendra_Cms_Block_Widget_Block</widget_block>
                    </rewrite>
                </cms>
            </blocks>
        </global>
</config>

app/code/local/Bhupendra/Cms/Block/Block.php

<?php
class Bhupendra_Cms_Block_Block extends Mage_Cms_Block_Block {

   public function getCacheKeyInfo()
    {

      $blockId = $this->getBlockId();
      if ($blockId) {
            $result = array(
                $blockId,
                Mage::app()->getStore()->getCode(),
            );
      } else {
           $result = parent::getCacheKeyInfo();
       }
       return $result;
   }

}

app/code/local/Bhupendra/Cms/Block/Widget/Block.php

class Bhupendra_Cms_Block_Widget_Block extends Mage_Cms_Block_Widget_Block
{
       /**
     * Storage for used widgets
     *
     * @var array
     */
    static protected $_widgetUsageMap = array();

    /**
     * Prepare block text and determine whether block output enabled or not
     * Prevent blocks recursion if needed
     *
     * @return Mage_Cms_Block_Widget_Block
     */
    protected function _beforeToHtml()
    {
        parent::_beforeToHtml();
        $blockId = $this->getData('block_id');
        $blockHash = get_class($this) . $blockId;

        if (isset(self::$_widgetUsageMap[$blockHash])) {
            return $this;
        }
        self::$_widgetUsageMap[$blockHash] = true;

        if ($blockId) {
            $block = Mage::getModel('cms/block')
                ->setStoreId(Mage::app()->getStore()->getId())
                ->load($blockId);
            if ($block->getIsActive()) {
                /* @var $helper Mage_Cms_Helper_Data */
                $helper = Mage::helper('cms');
                $processor = $helper->getBlockTemplateProcessor();
                $this->setText($processor->filter($block->getContent()));
                $this->addModelTags($block);
            }
        }

        unset(self::$_widgetUsageMap[$blockHash]);
        return $this;
    }

     /**
     * Retrieve values of properties that unambiguously identify unique content
     *
     * @return array
     */
    public function getCacheKeyInfo()
    {
        $result = parent::getCacheKeyInfo();
        $blockId = $this->getBlockId();
        if ($blockId) {
            $result[] = $blockId;
       }
        return $result;
   }
}

Per maggiori informazioni puoi visitare il seguente blog e puoi anche scaricare da esso https://www.milople.com/blogs/ecommerce/solved-magento-static-block-display-issue.html


perché non lo impacchi in un modulo con compositore?
Aleksey Razbakov,

Non ho ricevuto molta risposta a questo post, quindi ho pensato che nessun corpo lo desiderasse nel modulo
Bhupendra Jadeja,

nessuno aveva ancora questo problema. nessuno usa ancora la nuova versione di Magento. non lo
userei

Ho aggiunto il link per scaricare questo modulo
Bhupendra Jadeja,

sarebbe bello averlo in github con modman e compositore come github.com/progammer-rkt/Rkt_SbCache
Aleksey Razbakov

4

C'è un altro problema con la cache dei blocchi CMS, che non è stato risolto con il codice dato dall'alto.

Se stai utilizzando URL sicuri e tag {{media}} nei tuoi blocchi CMS, riceverai il messaggio "Avviso contenuto non sicuro" dal browser, poiché Magento fornisce collegamenti non sicuri dalla cache.

Per risolverlo, è necessario aggiungere un altro tag di informazioni sulla cache, come

(int)Mage::app()->getStore()->isCurrentlySecure(),

1

Questo errore può essere corretto anche con questa piccola estensione (non è necessario modificare i file core né riscrivere i blocchi):

https://github.com/progammer-rkt/Rkt_SbCache

E contiene anche la riga menzionata da @AdvancedLogic per evitare avvisi di contenuto non sicuro:

(int)Mage::app()->getStore()->isCurrentlySecure()


questo non ha funzionato per 1 blocco in qualche modo
Aleksey Razbakov,

Per quale blocco? Non capisco, puoi essere più specifico, per favore?
zitix,

È solo un blocco statico. Niente di specifico. Ho anche pensato che fosse solo un blocco casuale. HTML non corretto. Sembrava che fosse stata utilizzata una cache errata per questo blocco. Non so come essere più specifico qui.
Aleksey Razbakov,
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.