dieser Thread soll ein Gedankenaustausch sein über die Backend-Performance im genannten Fall des gleichzeitigen Hinzufügens einer Vielzahl von Artikeln.
Um das überhaupt ermöglichen zu können, habe ich ein Plugin geschrieben, das die Produkt-Detailseite um die Varianten erweitert, damit man direkt die gewünschten Mengen zusammenstellen kann. Frontendseitig konnte ich ausreichend optimieren, zum Beispiel durch den Austausch der Select-Option-Felder durch reguläre Input-Felder.
Mit meinem Vorgehen habe ich jedoch wohl den von Shopware erdachten Pfad verlassen (immer einzelne Produkte hinzuzufügen).
Ich stoße in der Folge im Backend auf große Performance-Probleme hinter dem Endpunkt frontend.checkout.line-item.add. Der Endpunkt nimmt die gesamte Datenmenge auf und zerlegt sie in einzelne Teilaufgaben. Diese Teilaufgaben summieren sich zu einer enormen Menge von Queries gegen die Datenbank: aus ca. 90 hinzugefügten Varianten werden ca. 670 Datenbank-Anfragen und -Inserts. Die Select-Queries sind sehr groß und einzeln betrachtet sehr zeitaufwendig. Auch wird bisher nichts im Speicher vorbereitet, um dann zum Beispiel einen Gesamt-Insert in die Cart vorzunehmen, was vermutlich auch schneller laufen könnte.
Aus diesem Grund möchte ich gerne erfahren, ob auch andere Shopware-User oder -Entwickler meinen Anwendungsfall auf dem Schirm haben. Vielleicht gibt es ja einen Lösungsansatz, den ich bisher nicht bedacht habe, oder es gibt vielleicht bei Shopware bereits Optimierungen an dieser Schnittstelle.
Vielen Dank für Eure Informationen, Meinungen und Anregungen!
@Murmeltier : Das ist die DBAL-Request-Analyse von Symfonie im DEV-Modus des Shops (lokal)
@aggrosoft: Du meinst eine Sequenz von einzelnen Requests mit jeweils einem Produkt? Das habe ich bisher nicht getan, weil der Sourcecode am Endpunkt recht eindeutig die Payload in einzelne Produkte aufteilt und diese dann sequenziell abarbeitet.
Schau mal in vendor/shopware/storefront/Controller/CartLineItemController.php in die Funktion addLineItems. Dort siehst Du die foreach-Schleife. Für jedes Produkt einen HTTP-Request zu starten, würde den Overhead noch deutlich vergrößern.
Hi @csrn,
Vielen Dank für den Hinweis. Ich hab mir das Problem angeschaut, nachgestellt und einen Fix dafür bereit gestellt. Bei mir lokal hab ich das ganze zwar nicht über die Route aber mit einem kleinen PHP Script nachgestellt. Bei 500 Items brauch der „single-add“ 80 sekunden, mit einer riesigen Masse an Queries. Ich habe die Funktionen jetzt so umgebaut, dass sie mehrere LineItems entgegen nehmen und dementsprechend weiter reichen. Bei 500 Produkten komme ich dann auf 250ms PHP Execution.