Kurz und einfach erklärt
Der Beitrag handelt von der Verwaltung eines Shopware-Shops. Dort pflegt Ihr Team Artikel und Bestellungen. Ist sie langsam, kostet das Arbeitszeit.
Ab Werk laufen Aufgaben im Hintergrund im Browser. Arbeiten viele Leute zugleich, wird es zäh. Besser laufen diese Aufgaben direkt auf dem Server.
Eine eigene Suche hilft bei großen Beständen. Listen mit wenig Spalten laden schneller.
Große Wartungsläufe gehören in die Nacht. Gemessen wird zur Arbeitszeit.
Das ist vor allem vor dem Weihnachtsgeschäft wichtig. Wir helfen Ihnen dabei.
Ihre Kundschaft sieht vom Shop nur die Storefront. Ihr Team sieht die Verwaltung: Bestellungen bearbeiten, Artikel pflegen, Bilder hochladen, Gutscheine anlegen. Wird diese Oberfläche zäh, kostet jede Wartezeit Arbeitszeit, und zwar genau dann, wenn am meisten zu tun ist. In vielen Shops arbeiten vor und während des Weihnachtsgeschäfts mehr Menschen gleichzeitig in der Verwaltung als im übrigen Jahr (Projekterfahrung). Bei Shopware hängt das Tempo der Verwaltung vor allem an vier Stellen: an der Art, wie Hintergrundaufgaben abgearbeitet werden, an der Admin-Suche, an schweren Listen und an Index- und Wartungsläufen, die mitten am Arbeitstag starten. Dieser Beitrag zeigt, wie Sie jede dieser Stellen messen und umstellen – mit den Einstellungen, die die Shopware-Dokumentation selbst für den Produktivbetrieb nennt.
Das Wichtigste in Kürze
- Ab Werk arbeitet Shopware Hintergrundaufgaben im Browser ab, solange jemand in der Verwaltung angemeldet ist. Bei mehreren angemeldeten Nutzern führt das zu hoher CPU-Last und stört PHP-FPM (Shopware-Dokumentation).
- Im Produktivbetrieb gehört die Warteschlange in CLI-Worker, die systemd oder Supervisor am Laufen hält; bis zu drei Worker-Prozesse (Shopware-Dokumentation) gelten laut Shopware als normal.
- Für große Datenbestände entlastet OpenSearch die Admin-Suche. Seit Shopware 6.7.9.0 (Shopware-Dokumentation) kann es als experimentelle Funktion auch Listen und Filter der Verwaltung bedienen.
- Listen mit Seitenzahlen brauchen eine exakte Gesamtzahl, und genau diese Zählung beschreibt die Dokumentation als rechenintensiv. Weniger Spalten und schlanke Abfragen in Erweiterungen halten Listen schnell.
- Neuindizierung, Sitemap-Erzeugung und Bildläufe gehören in die Nacht: Die geplante Sitemap-Aufgabe lässt sich seit Shopware 6.7.1.0 (Shopware-Dokumentation) abschalten und per Cron starten.
- Gemessen wird zur Arbeitszeit mit echten Rollen: Netzwerk-Reiter, FPM-Statusseite und Slow Query Log, dessen Schwelle ab Werk bei 10 Sekunden (MySQL-Referenzhandbuch) liegt.
Warum die Verwaltung langsamer wird, wenn mehr Leute arbeiten
Die Shopware-Verwaltung ist eine Anwendung, die im Browser läuft und jede Liste, jede Suche und jedes Speichern über die Admin-API vom Server holt. Diese Anfragen landen in der Regel beim selben PHP-Prozesspool wie die Seitenaufrufe Ihrer Kundschaft. Wie viele Anfragen dort gleichzeitig bedient werden, begrenzt die Einstellung pm.max_children (PHP-Handbuch). Sind alle Prozesse belegt, wartet die nächste Anfrage – egal, ob sie von einer Kundin im Checkout oder von einem Kollegen im Bestellmodul kommt.
Für die Bedienung gelten dieselben Wahrnehmungsgrenzen wie überall: Bis etwa 0,1 Sekunden (Nielsen Norman Group 1993) wirkt eine Reaktion unmittelbar. Bis etwa 1 Sekunde (Nielsen Norman Group 1993) bleibt der Gedankenfluss erhalten, auch wenn die Verzögerung auffällt. Ab etwa 10 Sekunden (Nielsen Norman Group 1993) wandert die Aufmerksamkeit ab, und Menschen beginnen nebenher etwas anderes. Für die Reaktion auf einen Klick gilt ein INP von 200 Millisekunden (web.dev) oder weniger als gut. Eine Bestellliste, die nach jedem Filterwechsel mehrere Sekunden braucht, liegt weit jenseits dessen, was sich flüssig anfühlt.
Im Alltag fällt das selten als Einzelereignis auf. Es zeigt sich als Summe: Die Liste lädt etwas länger, das Speichern zieht sich, die Suche reagiert erst spät auf die Eingabe. Wer am Tag viele Bestellungen anfasst, verliert diese Sekunden viele Male. Und weil die Verwaltung auf denselben Server zugreift wie der Shop, kann eine überlastete Verwaltung auch die Antwortzeit der Storefront verschlechtern.
Abgrenzung
Der Admin-Worker: Hintergrundarbeit im Browser-Tab
Shopware erledigt viele Aufgaben nicht sofort, sondern stellt sie in eine Warteschlange: die Indexierung nach dem Speichern eines Artikels, Vorschaubilder nach einem Upload, geplante Wartungsaufgaben. Ab Werk liegen diese Aufgaben in der Datenbank und werden über den Browser abgearbeitet, solange jemand in der Verwaltung angemeldet ist (Shopware-Dokumentation). Die Dokumentation nennt das ausdrücklich einfach und schnell für die Entwicklung, aber nicht empfehlenswert für Produktivsysteme – und begründet es so:
With multiple users logged into the Administration, this can lead to a high CPU load and interfere with the smooth execution of PHP FPM.
Technisch funktioniert der Admin-Worker so: Die geöffnete Verwaltung sendet Anfragen an den Endpunkt /api/_action/message-queue/consume. Der Server arbeitet darin Nachrichten aus der Warteschlange ab, bis das Abfrageintervall abgelaufen ist; danach endet die Anfrage, und die Verwaltung startet die nächste (Shopware-Dokumentation). Ab Werk steht dieses Intervall auf 20 Sekunden (Shopware-Quellcode). Solange Arbeit ansteht, hält eine solche Anfrage also bis zu dieser Dauer einen PHP-Prozess besetzt – nicht für das, was die Person gerade tut, sondern für Aufgaben, die irgendwer im Shop ausgelöst hat. Ist die Warteschlange leer, kehrt die Anfrage früh zurück (Shopware-Quellcode).
Mehrere Personen in der Verwaltung bedeuten mehr dieser Anfragen. Damit sich die Browser nicht gegenseitig in die Quere kommen, sperrt Shopware jede Warteschlange für einen einzigen Abnehmer; die übrigen Anfragen bekommen eine Fehlermeldung statt Arbeit (Shopware-Quellcode). Die Last verschwindet dadurch nicht, sie wandert zwischen den Tabs hin und her, und jede Anfrage durchläuft trotzdem Anmeldung, Rechteprüfung und Sperre – auf denselben PHP-Prozessen, die die Klicks der Kolleginnen und Kollegen bedienen. Hinzu kommt der umgekehrte Fall: Ist niemand angemeldet, bleibt die Arbeit liegen. Was über Nacht aufgelaufen ist, arbeitet morgens der erste Browser ab, der die Verwaltung öffnet.
| Merkmal | Admin-Worker (Voreinstellung) | CLI-Worker (Produktivbetrieb) |
|---|---|---|
| Wo die Arbeit läuft | in Anfragen aus geöffneten Browser-Tabs | in eigenen Prozessen auf dem Server |
| Wann sie läuft | nur, solange jemand angemeldet ist | rund um die Uhr, auch ohne Anmeldung |
| Wer sie trägt | der PHP-FPM-Pool, der auch Shop und Verwaltung bedient | eigene Prozesse mit Grenzen für Laufzeit und Speicher |
| Wie viele parallel | je Warteschlange einer, weitere Tabs fragen vergeblich an | fest eingestellt und überwacht |
| Empfohlen laut Dokumentation für | die Entwicklung | Produktivsysteme |
Umstellen auf den CLI-Worker
Für Produktivsysteme empfiehlt die Dokumentation, die Warteschlange über die Kommandozeile abzuarbeiten. Dann werden Aufgaben auch erledigt, wenn niemand angemeldet ist, und die hohe CPU-Last durch mehrere Personen in der Verwaltung entfällt (Shopware-Dokumentation). Die Umstellung hat drei Teile: Worker als Dienst starten, den Admin-Worker abschalten und geplante Aufgaben getrennt anstoßen.
# config/packages/shopware.yaml
# Admin-Worker abschalten, sobald die CLI-Worker laufen
shopware:
admin_worker:
enable_admin_worker: falseDie Worker selbst laufen als Dienst, den systemd oder Supervisor bei Bedarf neu startet. Die Dokumentation zeigt dafür eine systemd-Vorlage, aus der sich mehrere gleichartige Instanzen starten lassen, und eine Ziel-Unit, die sie gemeinsam startet. Jeder Worker beendet sich nach einer festen Laufzeit oder bei Erreichen einer Speichergrenze, im Beispiel der Dokumentation nach 60 Sekunden (Shopware-Dokumentation). Der Dienst startet ihn danach frisch. Das ist gewollt: Symfony rät, Worker nicht unbegrenzt laufen zu lassen, und nennt als Beispiel einen Neustart nach 10 Nachrichten (Symfony-Dokumentation), weil einzelne Dienste mit der Zeit Speicher ansammeln.
[Unit]
Description=Shopware Message Queue Consumer, instance %i
PartOf=shopware_consumer.target
[Service]
Type=simple
User=www-data
Restart=always
WorkingDirectory=/var/www/html
ExecStart=php /var/www/html/bin/console messenger:consume --time-limit=60 --memory-limit=512M async low_priority
[Install]
WantedBy=shopware_consumer.target# Ziel-Unit anlegen, die alle Instanzen gemeinsam startet
cat > /etc/systemd/system/shopware_consumer.target <<'UNIT'
[Install]
WantedBy=multi-user.target
[Unit]
Description=shopware_consumer service
UNIT
# Instanzen aktivieren und starten
systemctl enable shopware_consumer@{1..3}.service
systemctl enable shopware_consumer.target
systemctl start shopware_consumer.target
# Geplante Aufgaben getrennt anstoßen: Eintrag in der crontab, nicht in diesem Skript
# */5 * * * * /usr/bin/php /var/www/html/bin/console scheduled-task:run --no-wait
# Bei jeder Auslieferung: laufende Worker sauber beenden, der Dienst startet sie neu
php /var/www/html/bin/console messenger:stop-workersDie Fehler-Warteschlange nicht vergessen
Wie viele Worker sinnvoll sind, hängt von der Art der Nachrichten ab. Produktindexierung läuft in der Regel langsam, andere Nachrichten sind schnell erledigt (Shopware-Dokumentation). Aus Erfahrung von Shopware sind bis zu drei Worker-Prozesse (Shopware-Dokumentation) im Produktivbetrieb normal und sinnvoll. Wer mehr braucht, verlagert die Warteschlange aus der Datenbank in ein eigenes Warteschlangensystem, damit die Datenbank nicht zum Engpass wird. Lange Indexierungsnachrichten lassen sich außerdem auf einen eigenen Transport legen, damit sie eilige Aufgaben wie den Mailversand nicht aufhalten.
Zwei Punkte gehören in den Ablauf jeder Auslieferung. Nach dem Einspielen neuen Codes beendet messenger:stop-workers die laufenden Worker sauber, damit sie mit dem neuen Stand neu starten (Symfony-Dokumentation). Und die Serverlast verschwindet durch die Umstellung nicht, sie wird planbar. Wie Sie den PHP-Prozesspool dafür passend bemessen, beschreibt der Beitrag zu OPcache, JIT und FPM-Workern.
Admin-Suche: wenn jede Eingabe die Datenbank trifft
Die Suchleiste der Verwaltung durchsucht Bestellungen, Kunden und Produkte. Ohne weitere Einrichtung beantwortet die Datenbank jede dieser Anfragen. Bei kleinen Katalogen fällt das kaum auf. Die Dokumentation hält OpenSearch oder Elasticsearch für lohnend, sobald ein Projekt mehrere tausend Datensätze (Shopware-Dokumentation) umfasst, und nennt es für große Sortimente unverzichtbar, weil MySQL oberhalb einer gewissen Sortimentsgröße schlecht mitkommt (Shopware-Dokumentation).
Für die Verwaltung gibt es einen eigenen Index, getrennt von der Suche im Shop. Seit Shopware 6.4.19.0 (Shopware-Dokumentation) unterstützt die Admin-Suche damit auch Abfragen mit UND- und ODER-Verknüpfung. Eingeschaltet wird sie über Umgebungsvariablen, aufgebaut wird der Index mit einem eigenen Befehl. Die Dokumentation rät, den Index im Auslieferungsablauf mit es:admin:index aufzubauen, statt fehlende Indizes bei jedem Schreibzugriff anlegen zu lassen – das kostet bei jedem Speichern eine zusätzliche Prüfung.
# Eigener OpenSearch-Index für die Verwaltung
ADMIN_OPENSEARCH_URL=localhost:9200
SHOPWARE_ADMIN_ES_ENABLED=1
SHOPWARE_ADMIN_ES_INDEX_PREFIX=sw-admin
SHOPWARE_ADMIN_ES_REFRESH_INDICES=0
# Danach im Auslieferungsablauf auf der Konsole, nicht in dieser Datei:
# bin/console es:admin:indexEinen Schritt weiter geht eine neuere Einstellung: Seit Shopware 6.7.9.0 (Shopware-Dokumentation) kann OpenSearch über ENABLE_OPENSEARCH_FOR_ADMIN_API auch unterstützte Listen, Filter und Suchen der Admin-API bedienen. Die Dokumentation führt das als experimentelle Funktion. Für einen Shop im Weihnachtsgeschäft heißt das: zuerst auf einer Testinstanz mit echtem Datenbestand prüfen, dann umstellen – nicht in der Woche vor dem Aktionsstart. Wie sich die Suche im Shop für die Kundschaft beschleunigen lässt, steht im Beitrag zu schnellen Suchvorschlägen.
Der stille Rückfall auf die Datenbank
Listen mit vielen Spalten und exakten Summen
Die Bestell- und die Produktliste gehören im Weihnachtsgeschäft zu den am häufigsten geöffneten Ansichten. Ihr Tempo hängt weniger an der Zahl der Zeilen auf dem Bildschirm als an der Abfrage dahinter. Jede Spalte, die Daten aus einer verknüpften Tabelle zeigt – Hersteller, Kundengruppe, Versandart, Zusatzfelder –, kann eine weitere Verknüpfung in der Abfrage bedeuten. Erweiterungen, die eigene Spalten oder Filter in Listen einhängen, vergrößern die Abfrage zusätzlich.
Teuer ist außerdem die Gesamtzahl. Eine Liste mit Seitenzahlen muss wissen, wie viele Treffer es insgesamt gibt. Die Admin-API kennt dafür mehrere Modi: keine Gesamtzahl, eine exakte Gesamtzahl oder nur die Auskunft, ob es eine weitere Seite gibt. Die exakte Zählung beschreibt die Dokumentation als rechenintensiv, die beiden anderen Modi als schnell (Shopware-Dokumentation). Für eigene Listen in Erweiterungen und für Schnittstellen, die nur durchblättern, reicht oft der Modus „gibt es eine nächste Seite“.
- Spaltenmenü der Liste: Spalten ausblenden, die im Tagesgeschäft niemand liest, und die Einträge je Seite auf das Nötige begrenzen.
- Im Netzwerk-Reiter des Browsers die Anfrage an /api/search/order öffnen und prüfen, welche Verknüpfungen und welcher Zählmodus mitgeschickt werden.
- Erweiterungen einzeln deaktivieren und die Antwortzeit derselben Liste erneut messen – auf einer Testinstanz, nicht im laufenden Betrieb.
- In eigenen Erweiterungen nur die benötigten Felder laden: Partial Data Loading wählt die Felder schon auf Datenbankebene aus, Includes filtern erst nach dem Laden (Shopware-Dokumentation).
Wo eine Liste trotz schlanker Spalten langsam bleibt, kann die Ursache in der Datenbank selbst liegen: Filter auf Zusatzfelder, die in JSON-Spalten gespeichert sind, große Tabellen ohne Aufräumlauf, Sperren durch parallele Schreibvorgänge. Wie Sie solche Abfragen finden und beschleunigen, zeigt der Beitrag zur Optimierung von Datenbankabfragen.
Medien und Vorschaubilder
Vor Aktionen werden besonders viele Bilder hochgeladen: neue Artikel, Aktionsbanner, Kategoriebilder. Jeder Upload erzeugt eine Nachricht für die Vorschaubilder, die anschließend über die Warteschlange abgearbeitet wird (Shopware-Dokumentation). Mit dem Admin-Worker entstehen die Vorschaubilder damit in Anfragen aus den Browser-Tabs des Teams – auf denselben PHP-Prozessen, die gleichzeitig dessen Klicks bedienen. Mit CLI-Workern läuft das in eigenen Prozessen im Hintergrund, und die Bildberechnung belegt keine PHP-FPM-Prozesse der Verwaltung mehr.
Wie viele Vorschaubilder je Upload entstehen, legt der Medienordner fest: Jedem Ordner sind Thumbnail-Größen zugeordnet, und für Ordner ohne Bedarf lässt sich die Erzeugung abschalten (Shopware-Dokumentation). Wer Bestandsbilder neu rechnen muss, startet media:generate-thumbnails außerhalb der Arbeitszeit. Seit Shopware 6.6.4.0 (Shopware-Dokumentation) lässt sich die Thumbnail-Erzeugung auch ganz an einen vorgeschalteten Bilddienst abgeben, der die Größen beim Abruf erzeugt; Shopware legt dann keine Thumbnail-Dateien und -Datensätze mehr an. Welches Bildformat sich dabei lohnt, ordnet der Beitrag zu JPEG XL im Browser ein. Wie die Aktionsbanner selbst ohne Layoutsprung in die Storefront kommen, zeigt der Beitrag zu Aktionsbannern zur Black Week.
Indexaufbau und Wartung außerhalb der Arbeitszeit
Manche Arbeit lässt sich nicht vermeiden, aber verschieben. Ein vollständiger Neuaufbau aller Indizes erzeugt Nachrichten für sämtliche Datensätze – ausgelöst über die Kommandozeile oder über den entsprechenden Knopf in den Einstellungen der Verwaltung (Shopware-Dokumentation). Wer das an einem Vormittag im November anstößt, verlängert die Wartezeiten im Team, bis die Warteschlange leer ist. Für den ganzen Shop empfiehlt die Dokumentation dal:refresh:index mit der Option --use-queue, damit die Arbeit über die Warteschlange läuft; der passende Zeitpunkt dafür ist die Nacht.
Dazu kommen geplante Aufgaben. Ab Werk erzeugt Shopware die Sitemap einmal täglich, in der Liste der Standardaufgaben steht dafür ein Intervall von 86.400 Sekunden (Shopware-Dokumentation). Bei großen Katalogen kann diese Aufgabe die Warteschlange lange belegen und andere Aufgaben aufhalten. Seit Shopware 6.7.1.0 (Shopware-Dokumentation) lässt sich die geplante Sitemap-Erzeugung abschalten und per Cron zu einer ruhigen Uhrzeit starten. Die Aufgabe für Produktexporte steht in derselben Liste mit einem Intervall von 60 Sekunden (Shopware-Dokumentation) – wer viele Exporte pflegt, prüft deren eigene Intervalle.
# config/packages/prod/shopware.yaml
shopware:
sitemap:
scheduled_task:
enabled: false # Sitemap per Cron statt über die Warteschlange
product_stream:
indexing: false # nur nach Abwägung, siehe unten# Sitemap nachts erzeugen, wenn niemand in der Verwaltung arbeitet
0 2 * * * cd /var/www/html && php bin/console sitemap:generate
# Vollständige Neuindizierung nur bei Bedarf, ebenfalls nachts und über die Warteschlange
# php bin/console dal:refresh:index --use-queueEin weiterer Kandidat ist der Indexer für dynamische Produktgruppen. Er pflegt eine Zuordnung von Produkten zu ihren Gruppen und kann bei großen Sortimenten oder häufigen Änderungen zum Engpass werden. Seit Shopware 6.6.10.0 (Shopware-Dokumentation) lässt er sich abschalten. Der Preis: Kategorieseiten mit dynamischen Produktgruppen zeigen eine Produktänderung erst, wenn der HTTP-Cache abläuft, und die Regelbedingung für Positionen in dynamischen Produktgruppen ergibt dann durchgehend „falsch“. Das ist eine Abwägung für Shops, die viel pflegen und wenig mit dynamischen Gruppen arbeiten, keine Standardeinstellung.
Kleine Schalter mit spürbarer Wirkung
Neben den großen Hebeln nennt die Dokumentation einige Einstellungen, die die Verwaltung direkt betreffen. Jede für sich ist klein, zusammen nehmen sie Last vom Server, die im Tagesgeschäft niemand bewusst bemerkt.
Mails über die Warteschlange
Shopware versendet Mails ab Werk synchron. Hakt der Mailserver, wartet das Speichern einer Statusänderung mit Benachrichtigung mit. Über die Warteschlange verschickt, entfällt diese Wartezeit in der Verwaltung.
Keine Beispielmail je Versand
Für die Autovervollständigung im Editor der Mailvorlagen schreibt Shopware beim Versand eine Beispielmail in die Datenbank. Die Einstellung update_mail_variables_on_send nimmt diese Last heraus.
Zählerspeicher entlasten
Der Zählerspeicher hält den Status der Warteschlange und die zuletzt genutzten Module. Mit mehreren Workern wird seine Tabelle oft gesperrt; Redis oder das Abschalten nehmen den Druck heraus.
APP_URL-Prüfung abschalten
Bei jedem Laden der Verwaltung ruft Shopware sich selbst auf, um APP_URL zu prüfen. Stimmt die Adresse, spart APP_URL_CHECK_DISABLED diesen Umweg.
OPcache groß genug
Shopware lädt bei jeder Anfrage viele Klassen. Die Dokumentation empfiehlt für opcache.max_accelerated_files einen Wert von 20.000 (Shopware-Dokumentation) oder mehr.
Preload mit Bedacht
Eine Preload-Datei bringt laut Dokumentation zusätzlich 2 bis 5 Prozent (Shopware-Dokumentation), verlangt aber nach jedem Leeren des Caches einen FPM-Neustart und legt die Erweiterungsverwaltung lahm.
Die Mailumstellung hat dabei einen großen Alltagseffekt für das Team: Wer Bestellstatus ändert, Rechnungen erzeugt oder Gutscheine verschickt, löst Mails aus. Laufen sie synchron, bestimmt die Antwortzeit des Mailservers, wie lange die Verwaltung hängt (Shopware-Dokumentation). Die Einstellung zum Zählerspeicher hat einen Nebeneffekt: Abgeschaltet zeigt die Verwaltung keine Benachrichtigungen zur Warteschlange und keine Übersicht der Modulnutzung mehr. Wer Redis bereits für Caching-Strategien betreibt, verlegt den Zähler besser dorthin.
Messen, bevor umgebaut wird
Welche der Stellen in Ihrem Shop bremst, zeigt nur eine Messung zur Arbeitszeit. Eine Messung am Sonntagabend mit einer einzigen angemeldeten Person findet weder den Admin-Worker noch die Sperren, die erst mit mehreren Workern auftreten. Sinnvoll ist ein Messfenster an einem normalen Arbeitstag, mit den Rollen, die tatsächlich arbeiten: Kundendienst, Versand, Artikelpflege.
- Im Browser: den Netzwerk-Reiter öffnen, nach /api/ filtern und die langsamsten Anfragen notieren. Lange offene Anfragen an message-queue/consume zeigen, dass der Admin-Worker arbeitet.
- Am PHP-Prozesspool: die FPM-Statusseite über pm.status_path einschalten und beobachten, wie viele Prozesse aktiv sind und ob die Obergrenze erreicht wird (PHP-Handbuch).
- Im FPM-Slowlog: request_slowlog_timeout setzen. Ab Werk ist die Funktion ausgeschaltet; gesetzt schreibt FPM für jede Anfrage über der Schwelle einen Backtrace in das Slowlog (PHP-Handbuch).
- In der Datenbank: Das Slow Query Log zeichnet Abfragen über long_query_time auf, ab Werk sind das 10 Sekunden (MySQL-Referenzhandbuch). Für die Verwaltung ist das viel zu grob, also für das Messfenster eine deutlich niedrigere Schwelle setzen und danach zurückstellen.
- Auf dem Server: Server-Timing-Kopfzeilen zeigen, wo die Zeit einer Anfrage im Backend vergeht – mehr dazu im Beitrag zu Server-Timing.
Aus diesen Werten entsteht eine kleine Tabelle je Ansicht: Bestellliste, Produktliste, Suche, Speichern eines Artikels, Upload. Jede Zeile hat einen Ausgangswert vor der Umstellung und einen Wert danach, gemessen unter vergleichbarer Last. Wer vor dem Weihnachtsgeschäft zusätzlich wissen will, wie viel gleichzeitige Arbeit der Server trägt, ergänzt einen Lasttest, der Verwaltung und Shop zusammen belastet. Eine Performance-Analyse liefert dafür die Ausgangsmessung.
Die Faustregel für die Verwaltung
Die Umstellung vor dem Weihnachtsgeschäft
Die Hebel greifen ineinander, deshalb lohnt eine feste Reihenfolge. Der Worker steht vorn, weil Suchindex, Vorschaubilder und Indexierung von ihm abhängen: Ohne laufende Worker im Hintergrund wird auch der OpenSearch-Index nicht aktuell gehalten, die Dokumentation nennt sie ausdrücklich als Voraussetzung (Shopware-Dokumentation).
- Ausgangswerte zur Arbeitszeit messen, je Ansicht und Rolle.
- CLI-Worker als Dienst einrichten, Fehler-Warteschlange und geplante Aufgaben einbeziehen, dann den Admin-Worker abschalten.
- Mails über die Warteschlange verschicken und die kleinen Schalter setzen.
- Die Admin-Suche auf OpenSearch umstellen und den Index in den Auslieferungsablauf aufnehmen.
- Listen entschlacken: Spalten, Einträge je Seite, Erweiterungen mit eigenen Spalten.
- Sitemap, Neuindizierung und Bildläufe in die Nacht legen.
- Unter vergleichbarer Last nachmessen und die Werte festhalten.
In der Verwaltung wird nicht gekauft, aber dort entsteht alles, was gekauft wird. Wer dem Team im Weihnachtsgeschäft Wartezeit abnimmt, gewinnt Zeit für Kundenanfragen, Versand und Pflege.
Ein großer Teil dieser Arbeit ist Konfiguration, kein Umbau. Was sich lohnt, entscheidet die Messung: In manchen Shops reicht der Wechsel auf CLI-Worker, in anderen bremsen Erweiterungen in den Listen oder eine Datenbank, die schon für die Storefront knapp bemessen ist. Für die Storefront gelten eigene Hebel, vom HTTP-Cache bis zur Theme-Kompilierung – zusammengefasst im Beitrag Shopware Performance: Ladezeiten im Shop senken. Für Verwaltung und Storefront zusammen bieten wir die Shopware-Performance-Optimierung an, für Worker, PHP-Pool und Datenbank die Server-Optimierung.
Quellen und Dokumentation
Verwandte Artikel
Aktionsbanner zur Black Week ohne Layoutsprung einbauen
Hinweisleiste, Countdown, Pop-up und Badges zur Black Week ohne Sprung einbauen: Platz reservieren, serverseitig ausliefern, CLS bei höchstens 0,1 halten.
JPEG XL zurück im Browser: Lohnt das Bildformat für Shops?
Chrome 155 und Firefox 158 dekodieren JPEG XL. Wann sich das Format neben AVIF und WebP für Shops lohnt und wie Sie JPEGs verlustfrei umpacken und ausliefern.
Optimierungen von gestern: was unter HTTP/2 heute bremst
Domain-Sharding, Sammeldateien, Sprites und Data-URIs stammen aus der HTTP/1.1-Zeit. Wie Sie sie im Wasserfall erkennen und unter HTTP/2 sicher zurückbauen.