Per API Call ein Bulk Upload für ca. 50.000 Bilder

Hallo liebe Community,

ich bin gerade dabei, eine JS CLI Anwendung zum Synchronisieren von Artikeln mit einem Großhändler zu erstellen.

Wir bekommen die Artikeldaten täglich per CSV-Datei zur verfügung gestellt.
Diese werden dann durch das Skript aufbereitet.
Danach sende ich ein Bulk Payload an ‚_action/sync‘.
Mit den knappen 200 Kategorien und ca. 9000 Artikeln klappt das bereits sehr gut.

Nun stehe ich vor dem Problem, dass die Artikel natürlich Bilder haben sollten.
Ich bin nach erster Recherche auf ca. 48.000 Bilder gekommen.

Die Bilder werden von dem Großhändler lediglich als URL mitgegeben.
Dadurch müsste ein Upload per URL stattfinden.

Nach der Dokumentation müsste ich nun für jedes Bild eine neue Media Ressource erstellen über /media.
Mit der Id der neu erstellen Ressource dann per /_action/media/{mediaId}/upload die URL übergeben.
Wenn dann das Bild hochgeladen ist eine neue Product Media Ressource mit der ProductId sowie der MediaId generieren und das erste Bild zusätzlich noch als Cover Image im Produkt hinterlegen.

Das ist jedoch ohne Time Out oder Speicher Überschreitung auf dem Server nicht möglich.

Ist jemand zufällig auf das selbe Problem gestoßen und hat eine Lösung gefunden, die er gerne Teilen möchte?

Ich bin für jede Hilfe dankbar.

Unabhängig des konkreten Requests unterteile ich alle API-Calls in Chunks, je nach Request in größere oder kleinere. Dadurch werden für 1000 Artikel nicht ein sync Call sondern 10 oder gar 100 getätigt. Dadurch wird der Server entlastet.

Per API kannst du ja generell (für alles) schon vorher definierte UUID festlegen. Damit kannst du dann weiterarbeiten, ohne die UUID erst explizit wieder abfragen zu müssen.

Dein Problem wird möglicherweise aber der Iterator von Shopware sein, der auf 50 eingestellt ist. Da musst du mal schauen, ob du den Wert auf 1

Hi Max_Shop,

Das generieren der UUID ist kein Problem, ich erstelle sowieso für jede Entity eine eigene UUID v5, damit man diese leichter wiederfindet.

Dein Vorschlag ändert jedoch erstmal nichts an den >=50.000(mal 2?) abfragen an den Server um die Media Entity und danach die URL zu pushen.

Der Server verpasst mir ein 500 nach ca 1000 Anfragen, deshalb musste ich die Requests vergrößern und schicke per Sync direkt 1000 Entitys per Aufruf.

Die Bilder wollen jedoch nicht per _action/sync hochgeladen werden, da ich der entity „media“ keine URL mitgeben darf.

Oder hab ich jetzt einen Denkfehler?

Wieso bekommst du nach 1000 Anfragen ein 500er Fehler… scheint mir nicht logisch. Wenn der Server überlastet ist, dann wird die Antwort langsamer. Nur ein PHP memory_limit oder timeout erzeugt normalerweise ein 500er Fehler. Aber das heißt ja dann wieder, dass die einzelne Anfrage zu groß war.

Mit media habe ich zu wenig gearbeitet um das so zu wissen. Beim Produkt sollte eine URL aber möglich sein, dann zieht Shopware sich das Bild automatisch (oder war das nur in Shopware 5, gerade nicht sicher).

Zwischen meinen Chunks habe ich ein sleep in meinem Script eingebaut, dass den Server dadurch entlastet und nicht unbegrenzt mit Anfragen überlastet.

Das habe ich gar nicht gesehen, aber ja. Das steht jedenfalls so in der Doku. Ich versuche mal mein Glück und setze die Url von den Bildern und dem Cover direkt im Produkt, das könnte funktioniert.

Ich gebe Rückmeldung, mit einem Ergebnis :wink: