Produkte schneller speichern mit addAttributeUpdate()

Das Speichern von Produkten in Magento ist immer eine zeitkritische Herausforderung. Gerade in Importskripten und bei Massenupdates geht hier wertvolle Zeit verloren. Hier findet Ihr einen Ansatz, mit dem man sehr schnell mit den Magento-eigenen Methoden Daten speichern kann.

Erstmal der übliche Weg:

$sku = '123';
$storeId = 0;
$id = $product->getIdBySku($sku);
$product->setStoreId($storeId);
$product->load($id);
$product->setStatus(Mage_Catalog_Model_Product_Status::STATUS_DISABLED);
$product->save();

Hierbei wird jedoch durch $product->save() ein großer Overhead mitgeschleppt. Wenn man nur sehr wenige Attribute ändern möchte, geht dies deutlich schneller:

$sku = '123';
$storeId = 0;
$id = $product->getIdBySku($sku);
$product->load($id);
$product->addAttributeUpdate('status',Mage_Catalog_Model_Product_Status::STATUS_DISABLED,$storeId);

Eigenen Benchmarks auf meiner lokalen Entwicklungsumgebung (Zend Server CE auf Macbook Pro, Cache deaktiviert, 3 Storeviews) haben gezeigt, dass einfache Änderungen in dieser Art ca. 50x schneller gespeichert werden. 100 Änderungen werden jetzt nicht mehr in 200 Sekunden gespeichert, sondern in 3-4 Sekunden.

Tags: , , ,

2 Antworten zu “Produkte schneller speichern mit addAttributeUpdate()”

  1. Vinai Kopp 24. Oktober 2010 at 14:16 #

    Hi,
    die Methode ist ausgezeichnet, ich wusste noch nicht das $product->setData(…)->getResource()->saveAttribute() jetzt diesen Wrapper hat!
    Das Problem ist dabei allerdings das (je nach Attribut) nicht alle Indexe aktualisiert werden (flat calatlog product table, category product index, price index,…).
    Das muss dann nach den updates von Hand angestoßen werden.

  2. Michael Karl 21. November 2010 at 01:53 #

    Vielen Dank. Die Methode funktioniert hervorragend, und läuft merklich schneller. Der Abgleich mit dem ERP-System lässt sich nun sehr viel schnell vornehmen. Die Aktualisierung der Indexierung haben wir im Skript mit aufgenommen.

Kommentar schreiben

You must be logged in to post a comment.