Aktualisieren
Ich suche nach der schnellsten und zuverlässigsten Methode zur Aktualisierung von Massenattributen
"Massenattribut-Aktualisierung" für Attribute oder Produkte?
Denken Sie, die Aktualisierung mehrerer Attribute ist bereits beantwortet, aber für Produkte kann dies nützlich sein ...
Wenn Sie Produkte aus der Sammlung aktualisieren möchten, sollten Sie dies nicht tun ...
foreach ($collection as $product) {
$product->setSomeData(...);
# not here
$product->save();
}
Dadurch werden Ereignisse ausgelöst, Preisregeln und Indizes neu erstellt. Damit werden keine Ereignisse (und einige andere Dinge) übersprungen und sind viel schneller.
foreach ($collection as $product) {
$product->setSomeData(...);
}
$collection->save();
Um Preisaktualisierungen zu vermeiden, können Sie Folgendes hinzufügen:
$product->setIsMassupdate(true);
Informationen zum Aktivieren / Deaktivieren der Neuindizierung finden Sie unter https://github.com/Flagbit/Magento-ChangeAttributeSet/commit/676f3af77fec880bc64333403675d183e8639fae
/**
* Set indexer modes to manual
*/
private function _storeRealtimeIndexer()
{
$collection = Mage::getSingleton('index/indexer')->getProcessesCollection();
foreach ($collection as $process) {
if($process->getMode() != Mage_Index_Model_Process::MODE_MANUAL){
$this->_index[] = $process->getIndexerCode();
$process->setData('mode', Mage_Index_Model_Process::MODE_MANUAL)->save();
}
}
}
/**
* Restore indexer modes to realtime an reindex product data
*/
private function _restoreRealtimeIndexer()
{
$reindexCodes = array(
'catalog_product_attribute',
'catalog_product_flat'
);
$indexer = Mage::getSingleton('index/indexer');
foreach ($this->_index as $code) {
$process = $indexer->getProcessByCode($code);
if (in_array($code, $reindexCodes)) {
$process->reindexAll();
}
$process->setData('mode', Mage_Index_Model_Process::MODE_REAL_TIME)->save();
}
}
Und auch das Leeren des Caches vor der Massenaktualisierung (Produktaktualisierung) kann die Leistung steigern ...
Mage::app()->getCacheInstance()->flush();
Einige Zahlen vom Debuggen hier: https://github.com/Flagbit/Magento-ChangeAttributeSet/issues/16
Mage::getSingleton('catalog/product_action')->updateAttributes(...)
scheint nicht die schnellste Methode zu sein ... zumindest nicht bei eingeschaltetem Mutlistore-Setup und Flat Tables ...
saveAttribute()
$product = Mage::getModel('catalog/product')->load($productId);
$resource = $product->getResource();
$product->setData($attributeCode, $attributeValue);
$resource->saveAttribute($product, $attributeCode);
- Insgesamt Inkl. Wandzeit (Mikrosekunde): 437.787 Mikrosekunden
- Insgesamt Inkl. CPU (Mikrosekunden): 423.600 Mikrosekunden
- Insgesamt Inkl. MemUse (Bytes): 4.433.848 Bytes
- Insgesamt Inkl. PeakMemUse (Bytes): 4.395.128 Bytes
- Anzahl der Funktionsaufrufe: 25.711
updateAttributes()
Mage::getSingleton('catalog/product_action')->updateAttributes(
array($productId),
array($attributeCode => $attributeValue),
$storeId
);
- Insgesamt Inkl. Wandzeit (Mikrosekunde): 3.676.950 Mikrosekunden
- Insgesamt Inkl. CPU (Mikrosekunden): 3.122.064 Mikrosekunden
- Insgesamt Inkl. MemUse (Bytes): 8.174.792 Bytes
- Insgesamt Inkl. PeakMemUse (Bytes): 8.199.192 Bytes
- Anzahl der Funktionsaufrufe: 150,132
updateAttributes()
(Ressourcen-Singleton)
Mage::getResourceSingleton('catalog/product_action')->updateAttributes(
array($productId),
array( $attributeCode => $attributeValue),
$storeId
);
- Insgesamt Inkl. Wandzeit (Mikrosekunde): 94.155 Mikrosekunden
- Insgesamt Inkl. CPU (Mikrosekunden): 48.568 Mikrosekunden
- Insgesamt Inkl. MemUse (Bytes): 1.426.304 Bytes
- Insgesamt Inkl. PeakMemUse (Bytes): 1.370.456 Bytes
- Anzahl der Funktionsaufrufe: 2.221