Im Idealfall wird ein Produkt in einem Onlineshop öfter vom Kunden angeschaut als vom Shopbetreiber bearbeitet. Oder anders gesagt: Es gibt mehr lesende als schreibende Zugriffe. Lesende Zugriffe sind natürlich schneller erledigt als schreibende, bei einem viel besuchten Shop ist das Erzeugen einer Produktseite mit allen Informationen dank der komplexen Datenbank-Struktur (EAV-Modell) aber dennoch eine aufwendige Operation.
In Magento sind aus diesem Grund unterschiedliche Beschleunigungs-Mechanismen eingebaut. Zum einen werden seitens der Datenbank zusätzlich zu den EAV-Tabellen noch Flat-Tabellen genutzt, auf die ich noch in einem zukünftigen Blogeintrag genauer eingehen werde. Zum anderen werden bereits erzeugte Ergebnisse wie zum Beispiel gerenderte HTML-Blöcke oder Sammlungsdaten (Collections) im Cache gesichert, damit diese bei späteren Abfragen schneller abgerufen werden können.
Nach dem Aufsetzen und Konfigurieren des Shops werden daher auch oft alle zu Verfügung stehenden Cache-Optionen in der Magento Administration aktiviert. Wird nun ein Datensatz im Cache abgelegt, erstellt Magento eine Datei mit den zu speichernden Daten im Ordner /var/cache . Da ein Abruf des Datensatzes dann aber immer noch ein Zugriff auf die Festplatte ist, hört die Performanceoptimierung hier natürlich nicht auf.
Neben diesem Dateisystemcache bietet Magento von Haus aus auch andere Caching-Backends. Genauer gesagt werden diese bereits vom in Magento verwendeten Zend-Framework bereit gestellt. Der Dateisystemcache ist hier nur die langsamste, dafür auf fast jeder Serverumgebung verfügbare Variante für das Caching.
Bei einigen stark frequentierten Shops für Kunden konnte ich auf das Memcache- oder das APC-Caching zurückgreifen. Hierfür mussten wir auf dem Webserver (alternativ auch extern) zuerst die Server-Module der jeweiligen Technologie installieren. Bei Memcache ist das ein Deamon-Prozess auf dem Server plus PHP-Modul, bei APC ist es nur ein zusätzliches PHP-Modul.
Ohne genauer auf die jeweilige Technologie einzugehen reicht hier denke ich die Aussage, das Memcache und APC die Datensätze im Arbeitsspeicher und nicht im Dateisystem ablegen. Der Performancegewinn ist hier also enorm.
Am Beispiel Memcache möchte ich die notwendigen Einstellungen in Magento hier nun einmal durchspielen. Voraussetzung ist natürlich das entweder der Webhoster überhaupt einen Memcache-Server anbieten kann. Oder, wie in meinem Fall, das die firmeneigene Techik-Abteilung im Nachbarraum die Memcache-Einrichtung auf dem Server übernimmt.
1. Serverkonfiguration prüfen
Eine .php-Datei mit “phpinfo()” auf dem Server erstellen und prüfen ob das Memcache-Modul geladen wird. Es sollte ein Bereich ähnlich diesem zu finden sein:

Memcache auf der phpinfo()-Seite
Der zweite Schritt ist es zu prüfen ob der Memcache-Server läuft. Hier empfehle ich einfach direkt ein Monitoring-Tool zu installieren: http://code.google.com/p/phpmemcacheadmin

Clusteransicht des phpmemcacheadmin
In der Konfiguration des phpmemcacheadmin muss lediglich die Adresse des Memcache-Servers eingetragen werden um eine umfangreiche Statistik über die Nutzung des Memcache-Servers zu erhalten.
2. Memcache in Magento einrichten
Vorweg der Code für die /app/etc/local.xml
...
<cache>
<backend>memcached</backend>
<memcached>
<servers>
<server>
<host><![CDATA[127.0.0.1]]></host>
<port><![CDATA[11211]]></port>
<persistent><![CDATA[1]]></persistent>
</server>
</servers>
<compression><![CDATA[0]]></compression>
<cache_dir><![CDATA[]]></cache_dir>
<hashed_directory_level><![CDATA[]]></hashed_directory_level>
<hashed_directory_umask><![CDATA[]]></hashed_directory_umask>
<file_name_prefix><![CDATA[]]></file_name_prefix>
</memcached>
</cache>
...
Dieser Code muss innerhalb des global-Tags eingebunden und konfiguriert werden. Speziell müssen der Host und der Port des Memcache-Servers eingetragen werden. Hier sind noch ein paar Konfigurationseinstellungen für den File-Cache integriert auf den Magento im Fehlerfall des Memcache zurückgreifen kann.
Prinzipiell sollte man solche Umbauarbeiten eh nur auf planmäßig offline genommen Shops oder Testsystemen vornehmen, dennoch gilt es folgendes zu beachten:
Man sollte man nicht direkt die Sessionverwaltung mit in den Memcache umziehen und unbedingt vor der Memcache-Konfiguration in Magento mindestens den Config-Cache deaktivieren. Funktioniert der Memcache-Zugriff nämlich nicht korrekt, hat man sich aus dem eigenen Shop-Backend ausgesperrt und das Entfernen des obigen Codes aus der local.xml schafft auch keine Abhilfe, da diese Einstellung wahrscheinlich noch irgendwo zwischengespeichert wurde.
Falls das doch einmal passieren sollte kann man in der Magento-DB in der Tabelle core_cache_option die einzelnen Cache-Typen von Hand deaktivieren. In älteren Magento-Versionen wurden diese Einstellungen noch in der Datei cache.ser im /app/etc Ordner gespeichert. Diese kann man einfach löschen und danach den Magento-Cache Ordner leeren.
Weitere mögliche Konfigurationen für das Caching finden sich in der von Magento mitgelieferten Beispieldatei /app/etc/local.xml.additional. Hier findet man Beispiele wie auch noch die Sessionverwaltung entweder in die Datenbank oder den Memcache-Server verlegt wird.
Hat alles funktioniert sollte sich das Magento-Grundsystem nun schneller “anfühlen”. Je nach Implementierung und gewähltem Shop-Design können die Geschwindigkeitszuwächse aber stark variieren.
Wie man auch Drittanbieter-Erweiterungen oder nachlässig erstellte Shop-Designs optimiert werde ich in einem der folgenden Blogeinträge behandeln.
Benötigen Sie mehr Informationen oder Hilfe bei der Umsetzung in Ihrer Magento Installation? Wenden Sie sich einfach an den Ansprechpartner für Online-Shops bei meinem Arbeitgeber basecom.