Atualizar
Estou procurando o método mais rápido e confiável para atualização de atributos em massa
"Atualização de atributos em massa" para atributos ou produtos?
Pense em atualizar vários atributos já está respondido, mas para produtos isso pode ser útil ...
Se você deseja atualizar produtos da coleção, não deve fazer isso ...
foreach ($collection as $product) {
$product->setSomeData(...);
# not here
$product->save();
}
Isso enviará eventos, reconstruirá pré-requisitos e índices. Com isso, nenhum evento (e outras coisas) é ignorado e é muito mais rápido.
foreach ($collection as $product) {
$product->setSomeData(...);
}
$collection->save();
Para evitar atualizações de pré-requisitos, você pode adicionar ...
$product->setIsMassupdate(true);
Para desativar / ativar o reindex em tempo real, dê uma olhada neste ... 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();
}
}
E também liberar o cache antes que a atualização em massa (produto) possa aumentar o desempenho ...
Mage::app()->getCacheInstance()->flush();
Alguns números de depuração aqui: https://github.com/Flagbit/Magento-ChangeAttributeSet/issues/16
Mage::getSingleton('catalog/product_action')->updateAttributes(...)
parece não ser o método mais rápido ... pelo menos não com a configuração do mutlistore e as tabelas planas ativadas ...
saveAttribute()
$product = Mage::getModel('catalog/product')->load($productId);
$resource = $product->getResource();
$product->setData($attributeCode, $attributeValue);
$resource->saveAttribute($product, $attributeCode);
- Total Incl. Tempo de parede (microsseguro): 437.787 microssegundos
- Total Incl. CPU (microssegundos): 423.600 microssegundos
- Total Incl. MemUse (bytes): 4.433.848 bytes
- Total Incl. PeakMemUse (bytes): 4.395.128 bytes
- Número de chamadas de função: 25.711
updateAttributes()
Mage::getSingleton('catalog/product_action')->updateAttributes(
array($productId),
array($attributeCode => $attributeValue),
$storeId
);
- Total Incl. Tempo de parede (microsseguro): 3.676.950 microssegundos
- Total Incl. CPU (microssegundos): 3.122.064 microssegundos
- Total Incl. MemUse (bytes): 8.174.792 bytes
- Total Incl. PeakMemUse (bytes): 8.199.192 bytes
- Número de chamadas de função: 150,132
updateAttributes()
(recurso singleton)
Mage::getResourceSingleton('catalog/product_action')->updateAttributes(
array($productId),
array( $attributeCode => $attributeValue),
$storeId
);
- Total Incl. Tempo de parede (microsseguro): 94.155 microssegundos
- Total Incl. CPU (microssegundos): 48.568 microssegundos
- Total Incl. MemUse (bytes): 1.426.304 bytes
- Total Incl. PeakMemUse (bytes): 1.370.456 bytes
- Número de chamadas de função: 2,221