REST-API You have requested a syntehtic service

Hi,

ich habe mal folgendes ausprobiert

und festgestellt, das wenn ich das ausführe folgende Exception geworfen wird:

[Symfony\Component\DependencyInjection\Exception\RuntimeException]
You have requested a synthetic service (“db_connection”). The DIC does not know how to construct this service.

Vermutlich liegt es daran, das es mit einem einfachen load(‘db_connection’) nicht funktioniert. Jedenfalls läuft bei mir der Speicher voll sobald ich die Resourcen der API verwende.

Ich verwende Shopware 5.2.9

Was hast Du den genau vor? Wenn Du z.B. auf die API Resource zugreifen möchtest geht das wie folgt: 

\Shopware\Components\Api\Manager::getResource('Article');

 

 20000 Artikel per $articleResource->updateByNumber(‚xyz‘, $restArticleData); aktualisieren.
Wenn ich den Aufruf auskommentiere dann läuft mein Arbeitsspeicher nicht voll. Verwende ich den Aufruf da oben dann läuft mein Speicher alle 30 Sekunden um 2 MB bis Exception memory exceeded. Batch kann ich nicht verwenden da ich jeden Artikel sofort speichern soll bzw komplett. Ich habe bei der shopware/Resource.php gesehen das Shopware „model“ und „db_connection“ reseted wenn es zu einem Fehler kommt. Jetzt dachte ich mir könnte ich das mal verwenden aber das geht net, da der service db_connection noch die konfiguration benötig und die wird nicht mit übergeben.

 Shopware()->Models()->getConnection()->getConfiguration()->setSQLLogger(null);

bringt nichts der Speicher läuft trotzdem voll. Achja in restArticleData steht immer ein Artikel mit Kategoriezuweisung (array) und einem Bild (array) und Download (array).

Die Methode resetEntityManager() wird eigentlich nur aufgerufen wenn es ein Fehler beim Update/Erstellen gab. In der Regel wird das durch fehlerhafte Daten erzeugt.

Am besten um den updateByNumber() block ein try catch machen und schauen bei welchem Artikel die Resource “aussteigt”. 

Ja aber die resetEntityManager() Funktion funktioniert ja nicht mal also kann ich mir daran kein Beispiel nehmen. Bei der Funktion hätte eher Container->set stehen müssen statt load().Das heißt kommt es irgendwan zu einem Fehler in der REST-API steigt sie sowieso aus. Das hat noch nie funktioniert. 

Ich habe eventuell den Titel falsch gewählt mein Problem ist das der Speicher voll läuft sobald ich die updateByNumber() Funktion aufrufe. Also dachte ich mir ich könnte die Funktion resetEntityManager() kopieren und nach jedem Aufruf aufrufen das geht aber nicht.

Der try catch Block fängt keine Exception ab. Der Speicher steigt ungefähr alle 30 Sekunden um 2 MB setzte ich einen Limit kommt die Exception das mein Speicher voll gelaufen ist. Jetzt möchte ich aber nicht das der Arbeitsspeicher voll läuft es muss ja irgendwo einen memory leak geben und die einzige Lösung ist es den EntityManager irgendwie zu reseten oder etwas ähnliches.

Warum fragst Du nach Hilfe wenn Du es anscheinend eh besser weißt? “Ergibt keinen Sinn mehr da die Antwort des Autors bearbeitet wurde” 

Den try/catch Block habe ich auch eingesetzt und bin dann dadurch auf fehlerhafte Artikel Daten gestoßen die man im vorfeld filtern oder ausortieren musste. scd16-unit-testing/ArticleImporter.php at master · teiling88/scd16-unit-testing · GitHub

Nebenher - der Teilauszug der da im Repo ist funktioniert übrigens mit 32.000 Stammartikel + Varianten ohne  MemoryLeak. In der Regel sind die Fehler doch in den gelieferten Daten zu suchen. 

hmm ich habe aber bereits ein try catch um den Aufruf und der schreibt nichts in den Log d.h. es wird keine Exception geworfen. Wie gesagt ich bekomme nur irgendwan ein Arbeitsspeicher problem. Ich werde noch einmal bei mir nachprüfen was genau an die Funktion übergeben wird. Ich weiß es nicht besser das habe ich niemals gesagt. Das war net gerade sehr höflich.

Ich weiß nicht ob es viel höflicher ist die eigenen Texte nachträglich zu editieren… Sorry - ich bin raus.

Tut mir leid das ich erst vorhin gemerkt habe das man mich falsch verstehen konnte. 

Habe den Fehler gefunden unzwar lag es an der aktivierten ShyimProfiler Erweiterung. Jetzt läuft mein Arbeitsspeicher nicht mehr voll.