Shopware Performance Tipps
Ganz grundsätzlich solltet ihr eine aktuelle PHP-Version verwenden. Shopware 4.3 benötigt mindestens PHP 5.4, je nach installierten Plugins kann und sollte eine aktuellere PHP Version verwendet werden. PHP 5.5 oder PHP 5.6 (je nach verwendeten Plugins und deren Kompatibilität) wird empfohlen. Die Verwendung eines Bytecode-Cache (ZendOpcache + APCu) bringt einen weiteren Performance-Schub. Der ZendOpcache sorgt dafür, dass nicht bei jedem Request alle beteiligten PHP-Dateien neu kompiliert und geladen werden müssen. APCu bietet einen User-Cache an.
Shopware performant in einem Mittwald Account über den Softwaremanager zu installieren ist einfach. Für die aktuelle Shopware-Version 5.0.1 wird euch direkt eine optimale PHP-Version vorgeschlagen, nämlich PHP 5.6.5 GRC in Kombination mit MySQL 5.6. Alternativ könnt ihr natürlich auch eine andere PHP-Version (ab PHP 5.4) verwenden. Die GRC-Varianten der PHP-Versionen sind auf Systeme wie Shopware optimiert und haben APCu und ZendOpcache direkt mit dabei. Mit dieser Konfiguration belohnen uns die Shopware „Performance checks“ mit drei grünen Häkchen. :)
HTTP-Cache aktivieren
Shopware bringt in der Standardkonfiguration ab Shopware 4.1 bereits einen Frontend-Cache mit. Dieser cacht die Ausgabe und sorgt für eine blitzschnelle Auslieferung des Shops aus dem Cache.
Der HTTP-Cache kann im Backend unter „Einstellungen“ → „Caches / Performance“ aktiviert und konfiguriert werden.
Shopware 4:
Unter dem Reiter „Einstellungen“ findet ihr den Reiter „HTTP-Cache“. Hier reicht ein Häkchen bei „HttpCache aktivieren“ aus, um den HTTP-Cache zu aktivieren.
Wenn ihr Shopware über unseren Softwaremanager installieren, haben wir das Plugin bereits standardmäßig für euch aktiviert.
Shopware 5:
In Shopware 5 findet sich die Einstellung im selben Dialog, nur die Bezeichnung hat sich geändert. Hier aktiviert ihr einfach den Radiobutton „Shop im Produktivmodus verwenden“.
HTTP-Cache konfigurieren
Außerdem findet sich auf der Einstellungsseite die Checkbox „Automatische-Cache-Invalidierung“. Wenn diese aktiviert ist, werden die gecachten Artikeldaten beispielsweise invalidiert, wenn Änderungen am Artikel vorgenommen werden.
Weiter unten auf der Seite findet ihr die beiden Bereiche „Definition der Controller (- Aktionen) Cache Zeiten“ und „Nicht gecachte Controller Tags“. Im ersten Bereich kann individuell festgelegt werden, wie viele Sekunden der Cache für bestimmte Bereiche des Webshops gültig sein soll. Beim Controller „frontend/index“, der die Startseite repräsentiert, ist der Cache im Standard beispielsweise 3600s, also eine Stunde, gültig. Nach Ablauf dieser Zeit wird der Cache bei Aufruf automatisch neu aufgebaut.
Im zweiten Bereich „Nicht gecachte Controller Tags“ kann definiert werden, welche Controller nicht gecached werden sollen, wenn bestimmte Tags in der Session auftauchen. Im Standard ist die Startseite („frontend/index“) beispielsweise mit dem Tag „price“ geflaggt. Wenn ein User also beispielsweise zu einer Kundengruppe gehört, die andere Preise als die Standard-Kundengruppe hat, soll die Startseite nicht komplett aus dem Cache geladen werden, damit die richtigen Preise angezeigt werden.
Cron einrichten und aktivieren
Shopware bringt einige vorgefertigte Cronjobs unter anderem zum aufräumen und automatischem Cache-leeren mit. Um diese zu aktivieren, müssen lediglich drei Schritte eingehalten werden:
- Cron-Plugin aktivieren
Im Plugin-Manager findet sich im Bereich „Shopware-Erweiterungen“ das Plugin „Cron“. Mit einem Klick ist das Plugin aktiviert und es können noch weitere Einstellungen gemacht werden, um den Aufruf der Cronjobs abzusichern. Bei Installation über den Mittwald Softwaremanager haben wir das Plugin für euch standardmäßig schon aktiviert.
- Shell-Script für Cronjob-Aufruf anlegen
Um den Apache-Server mit unserem Cronjob nicht zu belasten, legen wir uns ein kleines Shell-Script an, welches den Cronjob-Aufruf direkt über php anstößt. Dazu legen wir zum Beispiel unter /files die Datei shopware.sh mit folgendem Inhalt an und machen das Script ausführbar (zum Beispiel per SSH: chmod +x /files/shopware.sh):
Für Shopware 4:
#!/bin/bash
cd /html/shopware && /usr/local/bin/php_cli shopware.php /backend/cron
Ab Shopware 5:
#!/bin/bash
php_cli /html/shopware/bin/console sw:cron:run
- Cron im Kundencenter eintragen
Im Kundencenter sollte für den Shop ein Cronjob angelegt werden. Hier wählen wir den Typ „Benutzerdefinierter Aufruf“ und wählen den Interpreter „/bin/bash“. Wir tragen eine Bezeichnung für den Cronjob ein, ergänzen im Feld „Pfad / URL zum Script“ die URL „/files/shopware.sh“ und setzen das Häkchen „Cronjob aktivieren“. Weiter unten sollte noch ein Intervall für die Ausführung festgelegt werden. Dieses kann ruhig der kleinste in eurem Paket wählbare Intervall sein – Shopware regelt intern, wann welcher Cronjob in welchem Intervall aufgerufen wird.
Fazit
Mit aktiviertem Frontend-Cache und der PHP GRC-Version habt ihr die Grundlage für einen performanten Shopware Shop. Der Cronjob sorgt für das automatisierte Aufräumen und Leeren des Caches.
Grundsätzlich können installierte Plugins die Performance natürlich beeinflussen. Plugins können eigene JavaScript- und Stylesheet-Dateien nachladen, die den Seitenaufbau potentiell bremsen oder das Caching sogar ganz deaktivieren für bestimmte Bereiche.
Kommentare
Grüße Max
Seit Wochen endlich nach einer Lösung gesucht und final doch noch findig geworden. Vielen Dank für diesen tollen Beitrag. Lg Matthäus
Super Anleitung, in der Shopware Anleitung wird von der Servereinstellung gar nichts beschrieben. Hier versteht mann das der Server die Shopware Cronjobs anstoßen muss.
Grüße aus Niederbayern
mein Shop ist einfach zu langsam habe schon alles versucht wer kann mir helfenSchaut euch das selber mal an http://www.schmuck-und-ringe.de Wer kann mir da helfen ich kenne mich damit nicht so aus
Hallo Ralf,ich hab auch noch mal drüber geschaut und ich kann meinem Kollegen Jan bezüglich des Sliders nur zustimmen. Das Laden der Produkte für den „Frisch für Sie eingetroffen“-Slider hängt aus irgendeinem Grund in einer Endlosschleife bzw. es kommen keine Daten zurück. Es wäre natürlich interessant, die Ursache einzugrenzen. Kann es sein, dass die Kategorie, die da beim Slider eingestellt ist, nicht mehr existiert? Versuche da mal die Einstellungen anzupassen, ich gehe davon aus, dass das dein Problem lösen wird!Das ist der Request, der keine Daten zurückbekommt: https://www .schmuck-und-ringe.de/widgets/emotion/emotionArticleSlider/sort/newcomer?start=0&limit=10&category=15 Wenn ich den category-Parameter ändere, kommt zumindest mal etwas zurück: https:// www.schmuck-und-ringe.de/widgets/emotion/emotionArticleSlider/sort/newcomer?start=0&limit=10&category=12 Auch hier kann man sehen, dass die Kategorie 15 anscheinend nicht mehr existiert: Wo hingegen https:// www.schmuck-und-ringe.de/listing?sCategory=12 funktioniert. ;) Wenn es nicht klappt, sag Bescheid, dann schau ich gerne über deine Einstellungen. Viele Grüße Philipp
Hallo Ralf,
deine Seite lädt enorm lange, weil über 18.000 Requests laden.
Die ganzen Requests werden durch den Slider verursacht.
Wie viele Produkte hast du dem Slider zugeordnet? Hast du da evtl. alle Produkte aus dem Shop drin? Beschränke die Auswahl mal auf max. 10 Produkte und schaue dann nach Ladezeit.
Alternativ nimm den Slider mal raus und teste die Seite dann nochmal neu.
Gruß
Jan
Hi,
Wie kann man den Cache warmer per cron aktivieren?
Ich dachte den cron lasse ich nachts den Cache wärmen und ändere die Cache Zeiten von 3600 auf 86400. Damit sollte das meiste für ein Tag gecached sein oder?
Danke
Sunny
Hi Sunny,
du kannst den HTTP-Cache über die Shopware Console aufwärmen.
Das Kommando dazu wäre folgendes:
/html/shopware/bin/console sw:warm:http:cache
Diese Zeile kannst du, wenn du nach unserer Anleitung vorgegangen bist, auch ans Ende des Files /files/shopware.sh hängen. Wichtig ist hier nur, dass der Aufruf nach dem Cron-Aufruf kommt, da der Cron ja den HTTP-Cache (je nach Konfiguration, standardmäßig) leert.
Liebe Grüße
Philipp von Mittwald
könnten Sie nochmal genau erklären, wie der HTTP-Cache Warm per Cron funktioniert?
Wenn ich den Befehl direkt mit in die shopware.sh Datei schreibe, wird der Cache ja z.B. alle 5 Minuten aufgewärmt? (je nach Intervall)
Oder soll hierfür ein separater Cronjob einrichtet werden?
Freundliche Grüße,
Frederik
vielen Dank für deinen Kommentar.
Wie Philipp geschrieben hat, wird durch den Cron der Cache im konfigurierten Intervall automatisch geleert und muss dann natürlich auch wieder aufgewärmt werden.
Folgende "shopware.sh" würde ich demnach empfehlen:
#!/bin/bash
php_cli /html/shopware/bin/console sw:cron:run && php_cli /html/shopware/bin/console sw:warm:http:cache
Bei weiteren Fragen melde dich gerne.
Viele Grüße
Tobias vom Mittwald Software-Team
Oh, super. Danke für die Performance-Tipps. Den Beitrag habe ich direkt favorisiert.
Grüße aus Berlin
Was ist wenn ich bei meinem Anbieter (aix-cloud) keinen Interpreter auswählen kann?
Hallo Moritz,
wenn du bei aix-cloud für den Cronjob keinen Interpreter wählen kannst, würde ich davon ausgehen, dass die Standard-Einstellung funktioniert. Andernfalls würde ich mich an deiner Stelle an den Support deines Hosters wenden. Die können dir bestimmt bei der Einrichtung behilflich sein.
Liebe Grüße aus Espelkamp
Philipp