Zu lange Ladezeiten bei Produkt auslesen/update via bin/console

Hallo,

und zwar möchte ich alle Produkte auslesen und einen Wert aus dem Produkt in einem CustomField-Feld einen Wert einsetzen.

Hier mein Code:

        $criteria   = new Criteria();
        $criteria->addFilter( new EqualsFilter('active', true ) );
        $criteria->addFilter( new EqualsFilter('customFields.custom_delivery', NULL ) );
        $criteria->addFilter( new NotFilter( NotFilter::CONNECTION_AND, [new EqualsFilter('deliveryTimeId', null)] ) );
        $context    = Context::createDefaultContext();

        $result = $this->productRepository->search( $criteria, $context );

        if ( $result !== null && $result->getTotal() > 0 ) {
            foreach ($result->getElements() as $product) {
                $deliveryName = '';

                if ($product->getDeliveryTimeId() != '') {
                    $criteriaDt   = new Criteria();
                    $criteriaDt->addFilter( new EqualsFilter('deliveryTimeId', $product->getDeliveryTimeId()) );
                    $contextDt    = Context::createDefaultContext();

                    $resultDt = $this->deliveryTimeTranslation->search( $criteriaDt, $contextDt );

                    if ( $resultDt !== null && $resultDt->getTotal() > 0 ) {
                        foreach ($resultDt->getElements() as $delivery) {
                            $deliveryName = $delivery->getName();
                        }
                    }

                    $updateProduct = [];
                    $updateProduct['id'] = $product->getId();
                    $updateProduct['customFields']['custom_delivery'] = $deliveryName;

                    $setProduct[] = $updateProduct;

                    $this->productRepository->update( $setProduct, $context );
                }
            }
        }

Wenn ich nun bin/console ausführe, brauch das Skript pro Produkt um die 2-3 Sekunden, bis es fertig bearbeitet ist. Bei über 10.000 Produkten (inkl. Varianten) dauert das eine Ewigkeit. Ich würde gern verstehen, warum das so lange dauert. Jedoch kann ich an meinem Code kein Fehler sehen. Es ist alles gemäß Doku umgesetzt wurden.

Das Skript ist in der execute-Methode. Hier wird nichts weiter gemacht. Keine Wechselwirkungen möglich.

Wer kann helfen und sieht mein Fehler?

Beste Grüße
Nilik

Ein Update eines Produkts löst immer eine Reihe an nachfolgenden Prozessen aus (z.B. Cache leeren, product indexer etc pp). Hier solltest du nicht jedes Produkt in einer Schleife einzeln aktualisieren, sondern z.B. immer 100 Produkte sammeln und dann zusammen updaten.

Viele Grüße

1 „Gefällt mir“

Das heißt, dass muss außerhalb der foreach-Schleife und $setProduct muss dann das große array sein?

Mach ein $update array, das die $setProduct sammelt und außerhalb der Schleife prüfst du, ob du bereits 100 Elemente hast. Falls ja: mach das update und leere das array.

Viele Grüße

1 „Gefällt mir“

Danke. Das ist die Lösung. :+1:

Dieses Thema wurde automatisch 30 Tage nach der letzten Antwort geschlossen. Es sind keine neuen Antworten mehr erlaubt.