CMS-Block-Caching-Problem in EE 1.14.2

15

Ich habe ein Problem, das mit dem Zwischenspeichern von statischen CMS-Blöcken zusammenhängt.

Ich habe eine cms-Seite und innerhalb dieser Seite rendere ich eine Reihe von statischen cms-Blöcken. Eine vereinfachte Version des CMS-Seiteninhalts sieht folgendermaßen aus:

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

Die Seite wird wie erwartet geladen, unmittelbar nachdem der Blockcache geleert wurde. Diese Seite sieht ungefähr so ​​aus:

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

Nach dem ersten Laden der Seite ist der Inhalt jedoch bei jedem weiteren Laden der Seite falsch. Es sieht aus wie das:

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

Im zweiten Beispiel sehen Sie, dass die ersten beiden Promos korrekt sind, jedoch zeigt alles, was danach folgt, den falschen Inhalt für die block_id an. Außerdem werden die Blöcke promo_home_1_1 und promo_home_1_2 zweimal und promo_home_3_1 und promo_home_3_2 nie gerendert. Es ist wie die Zuordnung zwischen block_id und dem zugehörigen statischen Blockinhalt, der irgendwie verwechselt wird. Dies hängt mit dem Caching zusammen, da ich das Problem nicht mehr sehe, wenn der Blockcache nicht aktiviert ist.

Es ist wahrscheinlich auch erwähnenswert, dass diese Seite für EE 1.13 verwendet wurde. Nach dem Upgrade auf EE 1.14.2 ist dieses Problem jedoch aufgetreten.

Mir ist klar, dass es ziemlich schwer ist zu sagen, was falsch ist, ohne zu wissen, was sonst noch im System vor sich geht, aber ich hoffe, dass jemand mir hier wenigstens eine Richtung geben kann, da mir die Ideen ausgehen.

Aktualisieren:

Ich habe dies auch mit Widgets versucht, z

<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 diesem Fall haben alle 3 Blöcke den gleichen Inhalt zurückgegeben, obwohl die IDs auf verschiedene Blöcke in der Datenbank verweisen. Wenn der Cache geleert wird, ändert sich der zurückgegebene Block manchmal, aber alle drei Widgets haben immer noch den gleichen Inhalt.

Andrew Kett
quelle
Konnten Sie es für Widgets lösen?
Sergei Guk
Ich hatte dieses Problem eigentlich nicht, also nein, aber es sieht so aus, als hätte Mage_Cms_Block_Widget_Block das gleiche Problem und daher die gleiche Lösung
Andrew Kett

Antworten:

5

Ok, ich habe die Ursache für dieses Problem gefunden und es scheint ein Problem in Core Magento zu sein.

In Magento 1.14.2 wurde eine neue _construct-Methode zu Mage_Cms_Block_Block hinzugefügt, die den folgenden Code enthält.

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

Dies aktiviert effektiv das Caching für cms-Blöcke. Da kein Cache-Schlüssel festgelegt ist, wird auf den Mage_Core_Block_Abstract :: getCacheKeyInfo zurückgegriffen, der den Namen des Blocks im Layout verwendet. In diesem Fall verwenden wir keine Layout-XML-Datei, um den Block hinzuzufügen, und es ist kein Name festgelegt. Magento scheint dies zu versuchen, indem es so etwas wie ANONYMOUS_78 als Namen festlegt. Aus irgendeinem Grund scheint dies jedoch nicht zu 100% zu funktionieren, daher die Duplikate, die ich gesehen habe.

Meine Lösung bestand darin, die Mage_Cms_Block_Block-Klasse in meiner eigenen Erweiterung zu überschreiben und eine neue Methode hinzuzufügen, um den Cache-Schlüssel explizit auf die Block-ID und nicht auf einen zugewiesenen Wert festzulegen. Die Klasse sieht so aus:

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

Dies scheint das Problem gelöst zu haben.

Aktualisieren:

Es sieht so aus, als ob dasselbe Problem auch in CE 1.9.2 besteht

Andrew Kett
quelle
2

Für Magento EE-Kunden fordern Sie bitte den Patch SUPEE-5874 beim Magento Enterprise Support-Team an.

Es werden zwei Dateien aktualisiert

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

Ich kann den aktuellen Patch von Magento nicht veröffentlichen, da er deren Eigentum ist.

kab8609
quelle
1

Es freut mich, dass Magento nun auch statische Blöcke zwischenspeichert. Da die aktuelle aktualisierte Version dieses seltsame Problem aufgrund des Zwischenspeicherns von statischen Blöcken enthält, können Sie mein Modul absolut kostenlos verwenden.

Diese Erweiterung wurde erstellt, um statische Blöcke besser zwischenspeichern zu können. Dabei wird auch berücksichtigt, ob die Site gesichert ist oder nicht. Die Erweiterung hat auch keine Kernumschreibungen, was dieses Modul noch besser macht.

Hier gehts .

Um einen besseren Überblick über die Erweiterung zu erhalten, können Sie auf diesen Thread verweisen .

Rajeev K Tomy
quelle
0

Wir haben einen Patch für CE bereitgestellt, der dieses Problem behebt. Da EE seinen Sitz in CE hat, kann dies auch zutreffen.

Sie können diesen Pfad von meiner Liste herunterladen: https://gist.github.com/tux-rampage/77b286f7973336877f7b

Laden Sie den Inhalt herunter, entpacken Sie ihn und führen Sie den folgenden Befehl in Ihrem Magento-Stammverzeichnis aus:

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

Testen Sie dies in einer Staging-Umgebung, bevor Sie es auf einem Live-System anwenden!

Tux-Amoklauf
quelle