Performance
Eine Anleitung zur Performance-Diagnose in Shopware 6.7: eine Baseline mit curl, fünf Prüfungen in Reihenfolge (HTTP-Cache, Queue, PHP und Datenbank, Suche, Frontend) und wohin jedes Ergebnis führt.
Finden Sie die langsame Ebene, bevor Sie eine Einstellung ändern. Nehmen Sie mit curl eine Baseline auf und arbeiten Sie dann fünf Prüfungen in dieser Reihenfolge ab: HTTP-Cache, Queue, PHP und Datenbank bei einem Cache-Miss, Suche, Frontend. Jede Prüfung dauert Minuten und verweist auf die Checklisten-Punkte oder Anleitungen, die diese Ebene beheben. Führen Sie nach jeder Änderung dieselbe Baseline erneut aus, damit Sie sehen, was geholfen hat.
Geprüft gegen: Shopware 6.7.15.1, Oktober 2026. Die Cache-Zustände, die Profiler-Integrationen und die Queue-Befehle unten wurden aus diesem Release gelesen. Die Schwellenwerte der Core Web Vitals stammen von web.dev.
Die Performance-Checkliste nennt 16 Einstellungen. Welche davon für Ihren Shop zählen, hängt davon ab, wo die Zeit verloren geht. Eine schnellere Mail-Queue hilft einem Shop nichts, dessen Seiten nie aus dem Cache kommen.
Diese Anleitung ist der Schritt vor der Checkliste. Sie liefert eine Baseline und fünf Prüfungen in der Reihenfolge, die am schnellsten etwas ausschließt, und jede Prüfung endet mit einem Verweis auf die Einstellungen oder Anleitungen für diese Ebene. Die Messwerte sind Ihre eigenen. Hosting, Katalog und Traffic bestimmen, was ein normales Ergebnis ist, deshalb enthält die Anleitung keine Benchmark-Zahlen.
Wählen Sie drei URLs, die ein nicht eingeloggter Besucher öffnen kann: die Startseite, eine Kategorieseite und eine Produktseite. Rufen Sie jede zweimal auf und notieren Sie die Zeit bis zum ersten Byte (TTFB), also die Zeit, bis der Server beginnt, die Seite zu senden.
for url in \
https://shop.example.com/ \
https://shop.example.com/category-name/ \
https://shop.example.com/product-name/SW10001; do
for run in 1 2; do
curl -s -o /dev/null -w "run $run ttfb %{time_starttransfer}s %{http_code} $url\n" "$url"
done
done
curl sendet keine Cookies, deshalb sieht Shopware einen Besucher, der nicht eingeloggt ist und einen leeren Warenkorb hat. Genau diesen Traffic bedient der HTTP-Cache. Shopware setzt ein Cookie sw-states mit den Zuständen logged-in und cart-filled, und eine Anfrage mit einem der beiden Zustände überspringt den Cache.
Vergleichen Sie die beiden Läufe miteinander und achten Sie auf den Abstand. Die absoluten Werte hängen von Ihrem Hosting ab; behalten Sie sie als eigene Referenz und führen Sie dieselbe Schleife nach jeder Änderung aus. Betreiben Sie mehrere App-Server hinter einem Load Balancer mit Datei-Cache, kann Lauf 2 auf einem Server landen, der die Seite noch nicht gecacht hat. Wiederholen Sie die Anfrage dann ein paar Mal.
Zwei gleich langsame Läufe bedeuten, dass die Seite bei jeder Anfrage neu gebaut wird. Der HTTP-Cache von Shopware ist in 6.7 standardmäßig aktiv (SHOPWARE_HTTP_CACHE_ENABLED steht auf 1). Suchen Sie deshalb nach den üblichen Gründen, warum er nicht greift:
SHOPWARE_HTTP_CACHE_ENABLED=0. Prüfen Sie die .env-Dateien und die Umgebungsvariablen des Servers.
cf-cache-status).
cart-filled und bekommt nie eine gecachte Seite.
Sind die Seiten gecacht, entscheiden zwei Dinge, wie gut der Cache unter Last hält: wo er liegt und wie Invalidierungen behandelt werden. Die Cache-Gruppe der Checkliste deckt beides ab. App- und System-Cache nach Redis verschieben ist wichtig, weil der Datei-Cache unter Last langsamer wird und sich nicht zwischen App-Servern teilen lässt. Ausstehende Cache-Invalidierungen in Redis halten ist wichtig, weil sie standardmäßig in einer MySQL-Tabelle warten, die bei einem stark beschriebenen Shop in einen Deadlock laufen kann. Das Download-Formular der Checkliste finden Sie weiter unten auf dieser Seite.
Verspätete Bestellmails, stockende Importe, eine Indexierung, die den Produktänderungen hinterherhinkt, und Admin-Aktionen, die scheinbar nichts tun, sind Queue-Symptome. Ein Befehl zeigt den Rückstand:
bin/console messenger:stats
Er gibt pro Transport die Anzahl wartender Nachrichten aus. Er funktioniert für Transports, die ihre Nachrichten zählen können, und sowohl der Doctrine-Transport (der Standard) als auch der Redis-Transport können das. Führen Sie ihn mehrmals über einige Minuten aus:
Eine häufige Ursache für eine Queue, die niemand abarbeitet, ist der Admin-Worker: Er verarbeitet die Queue nur, solange jemand die Administration geöffnet hat. Der Checklisten-Punkt Admin-Worker abschalten und echte Worker betreiben erklärt die Lösung, und die Gruppe Queue und Cron deckt Scheduled Tasks, Mails und die Sitemap ab. Um die Queue ganz von MySQL zu nehmen, folgen Sie der Redis-Streams-Anleitung.
Lauf 1 aus der Baseline und jede Anfrage eines eingeloggten Besuchers oder eines Besuchers mit gefülltem Warenkorb zahlen die vollen Kosten für den Seitenaufbau. Zwei Sichten zeigen, wohin diese Zeit geht.
Shopware liefert eine Profiler-Integration namens ServerTiming mit. Aktivieren Sie sie, und jede Antwort enthält einen Server-Timing-Header, der die erfassten Schritte mit ihrer Dauer in Millisekunden auflistet.
# config/packages/shopware.yaml
shopware:
profiler:
integrations:
- ServerTiming
Laden Sie eine langsame Seite neu, öffnen Sie in den Entwicklertools Ihres Browsers das Netzwerk-Panel und sehen Sie sich den Tab Timing der Dokumentanfrage an. curl -sI zeigt denselben Header im Terminal.
Wichtig: Der Header ist für jeden Client sichtbar. Aktivieren Sie ihn auf Staging oder schalten Sie ihn auf Produktion wieder ab, sobald Ihre Messung fertig ist.
Schalten Sie das Slow Query Log von MySQL eine Weile ein und lassen Sie echten Traffic es füllen:
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1;
Das protokolliert jede Abfrage, die länger als eine Sekunde dauert. SHOW VARIABLES LIKE 'slow_query_log_file' gibt den Pfad der Logdatei aus, und mysqldumpslow gruppiert ähnliche Abfragen. Setzen Sie slow_query_log wieder auf 'OFF', wenn Sie fertig sind, denn das Log wächst mit dem Traffic. MariaDB verwendet dieselben Variablen.
Für einen Aufrufbaum statt einer Schrittliste nutzen Sie einen Profiler. Shopware liefert außerdem Integrationen für Tideways und Datadog mit, die in derselben Liste shopware.profiler.integrations aktiviert werden.
Wissen Sie, welche Schritte dominieren, nimmt die Checkliste ihnen Arbeit ab. Ihre Gruppe PHP und Deployment (OPcache, die kompilierte Umgebungsdatei, die Composer-Classmap) senkt den Overhead pro Anfrage. Ihre Gruppe Katalog und Storefront (reduzierte Produktdaten in Listings, der Product-Stream-Indexer) senkt die Arbeit pro Seite und pro Produktspeicherung.
Langsame Listings, langsame Filter und langsame Suchergebnisse können bedeuten, dass die Suche gegen MySQL läuft. Wenn OpenSearch oder Elasticsearch ausfällt, führt Shopware die Suche stillschweigend gegen MySQL aus, und bei einem großen Katalog kann dieser Fallback die Datenbank überlasten. Betreiben Sie gar kein OpenSearch, springen Sie zu Schritt 5.
bin/console es:status
es:status meldet den Zustand des Clusters und ob die Indexierung aktuell ist. Ein Cluster, der nicht grün ist, oder ein Befehl, der sich nicht verbinden kann, ist Ihre Antwort. Die Elasticsearch/OpenSearch-Anleitung behandelt die Einstellung, die den stillen Fallback in einen sichtbaren Fehler verwandelt, und der Checklisten-Punkt Suche nicht mehr auf MySQL zurückfallen lassen ist die Kurzfassung.
Antwortet der Server schnell und die Seite fühlt sich trotzdem langsam an, messen Sie echte Besucher, bevor Sie das Theme anfassen. PageSpeed Insights zeigt Felddaten aus dem Chrome UX Report für URLs mit genug Traffic, darunter einen Lighthouse-Laborlauf. Google bewertet eine Seite als gut, wenn beim 75. Perzentil der Besuche Largest Contentful Paint (LCP) höchstens 2,5 Sekunden, Interaction to Next Paint (INP) höchstens 200 Millisekunden und Cumulative Layout Shift (CLS) höchstens 0,1 beträgt.
Die Serverzeit ist Teil des LCP, eine langsame TTFB begrenzt also, wie gut der LCP werden kann. Deshalb kommen die Server-Ebenen zuerst.
Die Checkliste enthält eine Frontend-Einstellung: Speculation Rules API einschalten, eine Einstellung in der Administration, verfügbar seit 6.6.10.0. Sobald ein Käufer mit der Maus über einen Link fährt oder ihn drückt, beginnt der Browser, die nächste Seite zu rendern, und der Klick landet auf einer Seite, die schon aufgebaut ist. Darüber hinaus hängt es vom Theme ab, was zu ändern ist. Bildgrößen, Schriften und Skripte von Drittanbietern sind die üblichen Stellen, und diese Anleitung hört beim Messen auf.
Schritt 3. Cache-Misses sind teuer. Server-Timing und das Slow Query Log zeigen, warum.
Schritt 1. Die Seiten kommen nicht aus einem Cache.
Schritt 2. Prüfen Sie den Queue-Rückstand.
Schritt 4. Prüfen Sie, ob die Suche auf OpenSearch läuft.
Schritt 3. Diese Besucher überspringen den HTTP-Cache, also baut jede Anfrage die Seite neu.
Schritt 5. Messen Sie echte Besucher und sehen Sie sich dann das Theme an.
Die Fallstudie zum Produktimport zeigt die Queue-Seite davon. Bei einem Katalog mit 530.000 SKUs dauerte ein vollständiger Produktabgleich 33 Stunden. Parallele Batches und ein Delta-Sync brachten ihn auf 2,8 Stunden. Die Details stehen in der Fallstudie zum Produktimport.
messenger:stats zeigt, ob die Hintergrundarbeit hinterherkommt.
Geschrieben von Huzaifa Mustafa
Kostenloses PDF
16 Einstellungen, die einen Shopware-6-Shop schneller machen. Zu jeder gibt es die exakte Konfiguration, die nötige Version und das, was dabei kaputtgehen kann.
Ihre Adresse landet nur in unserem Postfach. Kein Newsletter. Datenschutzerklärung
Ihre Checkliste ist bereit.
Beginnen Sie mit dem Prüfbogen vorne im PDF. Hängen Sie bei einem Punkt fest? Schicken Sie uns die Details, wir antworten innerhalb von 24 Stunden.
Das hat nicht geklappt. Versuchen Sie es erneut oder schreiben Sie uns an [email protected]
Vertiefen Sie die Ebenen von oben:
Führen Sie die Baseline aus, bringen Sie die Zahlen mit und holen Sie sich eine zweite Meinung von einem zertifizierten Shopware-Entwickler.
Mit Entwickler sprechen