Türchen 22: Magento Block Caching

Türchen 22 ist ebenfalls etwas besonderes. Auch dieser Beitrag ist als Weihnachtsgeschenk an uns aus der Feder von Vinai entsprungen: Da Magento ohne Caching nur schlecht skaliert lohnt es sich in der Regel das Caching-Verhalten einer Seite zu optimieren. Wie ein Block gecached wird bestimmen drei Eigenschaften der Block Klasse:

1.) Die Lebenszeit

Durch die Eigenschaft cache_lifetime wird die Gültigkeitsdauer des Cache-Eintrags bestimmt, angegeben in Sekunden. Wird der Wert 0 oder false gesetzt, wird die Block-Ausgabe für immer gecached. Um das Caching für einen Block zu deaktivieren muss der Wert auf null gesetzt werden. Die Cache Lifetime kann bei vielen Blöcken auf gut via Layout XML gesetzt werden:

<reference name=“name.des.blocks“>
 <action method=“setCacheLifetime“<sec>3600</sec></action>
</reference>

So können viele Blöcke bei Bedarf gecached werden ohne das sie via überschrieben werden müssten. Der Default-Wert für cache_lifetime ist bei den meisten Blöcken null (deaktiviert).

2.) Der Cache Key

Der Cache Key identifiziert eindeutig einen Block-Cache-Eintrag. Sollen mehrere Variationen eines Blocks gecached werden, beispielsweise eine für jede Sprache, so muss sich die Eigenschaft cache_key für jede der Varianten unterscheiden. In der Regel wird letzteres erreicht in dem die aktuelle Store Id als Teil des Cache-Key gesetzt wird.

Seit Magento 1.4 wird der Cache-Key eines Blocks aus den Elementen des von der Methode getCacheKeyInfo() zurückgelieferten Arrays aufgebaut. Der Default Cache-Key eines Blocks ist der Name im Layout XML.

3.) Die Cache Tags

Die Cache Tags eines Blocks sind ein Array von Strings. Sie dienen dazu den Cache-Pool von Magento zu segmentieren. So kann z.B. der HTML Block-Cache gelöscht werden, ohne das der Konfigurations Cache-Pool davon beeinflusst wird. Als Default-Wert für die Cache-Tags wird array('block_html') verwendet. Meistens ist das so ausreichend, unter Umständen kann es jedoch hilfreich sein den Cache weiter zu segmentieren. Zum Beispiel könnte ein komplexer Navigations-Block mit den Cache-Tags array('block_html', 'navi') gecached werden. Jedes mal wenn sich etwas an der Datenstruktur ändert, aus dem die Navigation aufgebaut wird, kann dann gezielt nur der Navi-Cache aktualisiert werden: Mage::app()->cleanCache(array('navi'));



Ein Beitrag von Vinai Kopp
Vinai's avatar

Vinai Kopp arbeitet seit Oktober 2011 als Manager of Developer Education für Magento Inc. Vorher war er als freier Magento Entwickler und Berater tätig, mit dem Schwerpunkt Entwicklerschulung. Desweiteren ist er Co-Autor des Magento Entwicklerhandbuchs, erschienen im O'reilly Verlag.

Alle Beiträge von Vinai

Kommentare
Türchen 12: Magento Performance « Magento Blog für Entwickler und eCommerce-Shops - webguys.de Magento Blog für Entwickler und eCommerce-Shops – webguys.de am

[…] http://www.webguys.de/magento/turchen-22-magento-block-caching/ [2] https://github.com/avstudnitz/AvS_FastSimpleImport/pull/63 [3] […]

wolle am

Schöner Artikel, hat mir geholfen. Dabei habe ich rausgefunden, dass man auch zusätzlich die Cache Tags angeben kann. Da ich nichts dazu ergooglen konnte, hilfts vielleicht mal jemandem:


        cachetag1
        cachetag2
Steven Fritzsche am

Hi Vinai,

leider absolut zutreffend^.

Gruß von der Elbe an den Rhein ?!

Steven

Vinai am

Hallo Steven,

Seit dem Post ist ja schon einiges Wasser den Rhein hinab geflossen :) Der Code in Frage hat sich jedoch nicht geändert. Alle Block Klassen in Magento vererben ja den core/abstract Block. Dort wird auch der Default Cache Key festgelegt, wie in dem Blog Post beschrieben. Hier der Code mit den Default Cache Elementen aus Mage_Core_Block_Abstract:


    public function getCacheKeyInfo()
    {
        return array(
            $this->getNameInLayout()
        );
    }

Andere Blöcke können das natürlich ändern, so zum Beispiel Mage_Core_Block_Template:


public function getCacheKeyInfo()
    {
        return array(
            'BLOCK_TPL',
            Mage::app()->getStore()->getCode(),
            $this->getTemplateFile(),
            'template' => $this->getTemplate()
        );
    }

Da sieht die Sache schon anders aus. Je nach vererbter Klasse kann der Cache Key anders aussehen. Ich hoffe damit ist das alles etwas klarer.

Viele Grüße, Vinai

Steven Fritzsche am

Hätt ich doch mal lieber Vorschau geklickt^.

Action:

 xxxx 
Steven Fritzsche am

Hi Vinai,

die Aussage "Der Default Cache-Key eines Blocks ist der Name im Layout XML." kann ich so nicht bestätigen. Ich musste in meinem Fall die Action

xxxx

zu jedem der Blöcke manuell hinzufügen, damit er mir nicht immer den selben Content renderte. Mein Block selber überschreibt keine CacheKey-Methode. Allerdings wird er von der Klasse "Mage_Catalog_Block_Product_Abstract" abgeleitet, worin ich aber auch keine Veränderung des Standardverhaltens feststellen konnte.

Beste Grüße

Steven Fritzsche (Raucherzimmer)

Schick programmiert » Blog Archive » Magento Block Caching am

[...] Die Lösung habe ich in einer Serie von Blog-Einträgen für Weihnachten gefunden: http://www.webguys.de/magento/turchen-22-magento-block-caching/ [...]

Dein Kommentar