Обновить
Я ищу самый быстрый и надежный способ массового обновления атрибутов
«Массовое обновление атрибутов» для атрибутов или продуктов?
Думаю, что обновление нескольких атрибутов уже отвечено, но для продуктов это может быть полезно ...
Если вы хотите обновить продукты из коллекции, вы не должны делать это ...
foreach ($collection as $product) {
$product->setSomeData(...);
# not here
$product->save();
}
Это будет отправлять события, перестраивать цены и индексы. С этим никакие события (и некоторые другие вещи) не пропускаются и намного быстрее.
foreach ($collection as $product) {
$product->setSomeData(...);
}
$collection->save();
Чтобы избежать ценовых обновлений, вы можете добавить ...
$product->setIsMassupdate(true);
Чтобы отключить / включить переиндексацию на лету, взгляните на это ... 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();
}
}
А также очистка кеша перед массовым обновлением может повысить производительность ...
Mage::app()->getCacheInstance()->flush();
Некоторые цифры отладки здесь: https://github.com/Flagbit/Magento-ChangeAttributeSet/issues/16
Mage::getSingleton('catalog/product_action')->updateAttributes(...)
кажется, не самый быстрый способ ... по крайней мере, не с настройкой mutlistore и плоскими таблицами ...
saveAttribute()
$product = Mage::getModel('catalog/product')->load($productId);
$resource = $product->getResource();
$product->setData($attributeCode, $attributeValue);
$resource->saveAttribute($product, $attributeCode);
- Всего вкл. Время стены (мкс): 437 787 мксек
- Всего вкл. ЦП (микросекунд): 423 600 микросекунд
- Всего вкл. MemUse (байты): 4 433 848 байтов
- Всего вкл. PeakMemUse (байты): 4,395,128 байтов
- Количество функциональных вызовов: 25 711
updateAttributes()
Mage::getSingleton('catalog/product_action')->updateAttributes(
array($productId),
array($attributeCode => $attributeValue),
$storeId
);
- Всего вкл. Время стены (мксек): 3 676 950 мксек
- Всего вкл. ЦП (микросекунд): 3 122 064 микросекунд
- Всего вкл. MemUse (байты): 8,174,792 байта
- Всего вкл. PeakMemUse (байты): 8 199 192 байта
- Количество функциональных вызовов: 150 132
updateAttributes()
(ресурс синглтон)
Mage::getResourceSingleton('catalog/product_action')->updateAttributes(
array($productId),
array( $attributeCode => $attributeValue),
$storeId
);
- Всего вкл. Время стены (мкс): 94 155 мкс
- Всего вкл. ЦП (микросекунд): 48 568 микросекунд
- Всего вкл. MemUse (байты): 1 426 304 байта
- Всего вкл. PeakMemUse (байты): 1 370 456 байтов
- Количество функциональных вызовов: 2221