Schick programmiert

Magento Block Caching

Das Thema Caching ist bei Magento mit eines der Wichtigsten. Genau aus diesem Grund habe ich mich auch gewundert, als bei einem Shop der Cache für Block HTML deaktiviert war.

Der vorige Programmierer hatte dazu keine klare Aussage – also hab ich den Cache einfach aktiviert.

Problem: Der Link zum Warenkorb zeigt immer an, wie viele Produkte aktuell im Warenkorb liegen. Diese Anzahl wurde jetzt auch gecached. Somit hat der nächste Benutzer (der nach mir die Seite aufgerufen hat) gesehen, dass der Benutzer, der zuerst nach Leerung des Caches die Seite aufgerufen hat, 5 Produkte im Warenkorb hatte. Sorry für den komplizierten Satz..

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/

Weiterführende Links zum Magento-Wiki:
http://www.magentocommerce.com/wiki/5_-_modules_and_development/block_cache_and_html_ouput
http://www.magentocommerce.com/wiki/modules_reference/english/mage_adminhtml/system_cache/index

Man kann über die XML-Konfiguration (wo der Block definiert wird) oder in der PHP-Klasse (die den eigentlichen Block dar stellt) verschiedene Einstellungen für den Cache treffen. Die folgenden Punkte werden auf der o.g. Seite beschrieben:

  1. Lifetime – Lebenszeit
  2. Cache Key
  3. Cache Tags

Zur lifetime des Caches ist auf der o.g. Seite dokumentiert, dass man einen Wert in Sekunden angeben kann, 0 oder false für „cache allways“ und null für „no cache“.

Diese Dokumentation kann ich nicht bestätigen. Ich arbeite mit Magento 1.4.0.1 und setze in der XML-Konfiguration die lifetime auf 0 und das caching ist deaktiviert.

Die anderen beiden Punkte möchte ich hier nicht ansprechen, da ich sie nicht getestet habe. Sie sind aber auch mit einigem Text auf der genannten Seite beschrieben.

Weiterhin möchte ich eine andere – nicht Problem – aber Stolperfalle in einem Beispiel erklären.

Nehmen wir an, ich habe den Block Footer und habe dort keine Cache-Informationen gesetzt. Laut der o.g. Website sollte dann der Cache für meinen Block deaktiviert sein – aber da hat vielleicht mein Vorgänger dran rum gespielt – bei mir ist der Cache dann aktiviert. Ich weiß nur nicht für welchen Zeitraum.

In diesen Block Footer stecke ich jetzt einen anderen Block rein und nenne den FooterLinks. Angenommen mein Footer hat eine lifetime von 300 Sekunden (automatisch – durch irgendeine Konfiguration) und mein FooterLinks hat eine lifetime von 0 Sekunden (sollte laut genannter Website „cache allways“ sein – aber bei mir komischerweise „no cache“).

Bei der ersten Anzeige wird der Cache aufgebaut. FooterLinks mit 0 Sekunden und Footer mit 300 Sekunden. Der nächste Aufruf wird zuerst den Block Footer laden, dessen Cache eine lifetime von 300 Sekunden hat und darum den Block FooterLinks für die 300 Sekunden mit gecached hat.

Daher meine Anweisung:

Beim Einstellen der lifetime bei einem Block immer darauf achten, dass auch alle Parent-Elemente eine mindestens gleich-niedrige Cache-lifetime haben.

Getestet mit Magento 1.4.0.1

Bitte schreibt‘ ein Kommentar, wenn sich das in eurer Magento-Version anders‘ verhält.

Zum Schluss ein Beispiel für meinen XML-Code, wo es darum geht den Link für zum Warenkorb nicht im Cache zu speichern. Zusammenkopiert aus 2 XML-Dateien um mal ein etwas komplexes Beispiel zu geben:

    <default>
		<reference name="root">
			<block type="page/html_header" name="header" as="header" template="page/html/header.phtml">
                <action method="setCacheLifetime"><num>0</num></action>

				<block type="page/template_links" name="top.links" as="topLinks">
                    <action method="setCacheLifetime"><num>0</num></action>
				</block>
            </block>
		</reference>
	</default>
	<default>
		<reference name="top.links">
			<block type="checkout/links" name="checkout_cart_link">
                <action method="setCacheLifetime"><num>0</num></action>
				<action method="addCartLink" />
				<action method="addCheckoutLink" />
			</block>
		</reference>
	</default>

Categorised as: Uncategorized


3 Comments

  1. Tobias Vogt sagt:

    Danke für den Backlink 🙂

  2. Hallo,
    ich habe schon diverse Hinweise zu den Cache-Einstellungen per xml gefunden und dein Hinweis hat letztendlich funktioniert.
    DANKE!
    Bei mir war das -Tag entscheidend. Andere Beiträge nutzen oder , aber das hat bei mir zu Fehlermeldungen geführt.

  3. hmn, meine tags wurden gerade entfernt. 🙁
    wollte schreiben, dass das NUM-Tag funktioniert, aber nicht SEC oder VALUE

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.