Оновлення
Я шукаю найшвидший і надійний метод для масового оновлення атрибутів
"Масове оновлення атрибутів" для атрибутів чи продуктів?
Подумайте, що оновлення декількох атрибутів відповідає за все, але для продуктів це може бути корисним ...
Якщо ви хочете оновити продукти з колекції, ви не повинні цього робити ...
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/isissue/16
Mage::getSingleton('catalog/product_action')->updateAttributes(...)
Здається, це не найшвидший метод ... принаймні, не з налаштуванням мутлістору та включеними плоскими таблицями ...
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 мікросекунд
- Всього в т.ч. CPU (мікросекунди): 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
);
- Всього в т.ч. Час стіни (мікросекція): 94155 мікросекунд
- Всього в т.ч. Процесор (мікросекунди): 48,568 мікросекунд
- Всього в т.ч. MemUse (байти): 1426,304 байт
- Всього в т.ч. PeakMemUse (байти): 1,370,456 байт
- Кількість функціональних дзвінків: 2221