Actualizar
Estoy buscando el método más rápido y confiable para la actualización masiva de atributos
¿"Actualización masiva de atributos" para atributos o productos?
Piense que la actualización de múltiples atributos ya está respondida, pero para los productos esto puede ser útil ...
Si desea actualizar productos de la colección, no debe hacer esto ...
foreach ($collection as $product) {
$product->setSomeData(...);
# not here
$product->save();
}
Esto enviará eventos, reconstruirá precios e índices. Con esto no se omiten eventos (y algunas otras cosas) y es mucho más rápido.
foreach ($collection as $product) {
$product->setSomeData(...);
}
$collection->save();
Para evitar actualizaciones de precios, puede agregar ...
$product->setIsMassupdate(true);
Para deshabilitar / habilitar reindex sobre la marcha, eche un vistazo a esto ... 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();
}
}
Y también vaciar el caché antes de la actualización masiva (producto) puede aumentar el rendimiento ...
Mage::app()->getCacheInstance()->flush();
Algunos números de depuración aquí: https://github.com/Flagbit/Magento-ChangeAttributeSet/issues/16
Mage::getSingleton('catalog/product_action')->updateAttributes(...)
parece que no es el método más rápido ... al menos no con la configuración de mutlistore y las tablas planas activadas ...
saveAttribute()
$product = Mage::getModel('catalog/product')->load($productId);
$resource = $product->getResource();
$product->setData($attributeCode, $attributeValue);
$resource->saveAttribute($product, $attributeCode);
- Total incl. Tiempo de pared (microsec): 437,787 microsecs
- Total incl. CPU (microsecs): 423,600 microsecs
- Total incl. MemUse (bytes): 4,433,848 bytes
- Total incl. PeakMemUse (bytes): 4,395,128 bytes
- Número de llamadas a funciones: 25,711
updateAttributes()
Mage::getSingleton('catalog/product_action')->updateAttributes(
array($productId),
array($attributeCode => $attributeValue),
$storeId
);
- Total incl. Tiempo de pared (microsec): 3,676,950 microsecs
- Total incl. CPU (microsecs): 3,122,064 microsecs
- Total incl. MemUse (bytes): 8,174,792 bytes
- Total incl. PeakMemUse (bytes): 8,199,192 bytes
- Número de llamadas a funciones: 150,132
updateAttributes()
(recurso singleton)
Mage::getResourceSingleton('catalog/product_action')->updateAttributes(
array($productId),
array( $attributeCode => $attributeValue),
$storeId
);
- Total incl. Tiempo de pared (microsec): 94,155 microsecs
- Total incl. CPU (microsecs): 48,568 microsecs
- Total incl. MemUse (bytes): 1,426,304 bytes
- Total incl. PeakMemUse (bytes): 1,370,456 bytes
- Número de llamadas a funciones: 2,221