ปรับปรุง
ฉันกำลังมองหาวิธีที่รวดเร็วและเชื่อถือได้สำหรับการอัปเดตแอตทริบิวต์จำนวนมาก
"อัปเดตแอตทริบิวต์จำนวนมาก" สำหรับแอตทริบิวต์หรือผลิตภัณฑ์
คิดว่าการอัปเดตแอตทริบิวต์หลายรายการนั้นได้รับการตอบแล้ว แต่สำหรับผลิตภัณฑ์นี้สามารถเป็นประโยชน์ได้ ...
หากคุณต้องการอัปเดตผลิตภัณฑ์จากคอลเล็กชันคุณไม่ควรทำเช่นนี้ ...
foreach ($collection as $product) {
$product->setSomeData(...);
# not here
$product->save();
}
สิ่งนี้จะจัดส่งกิจกรรมสร้างราคาและดัชนีใหม่ เมื่อไม่มีเหตุการณ์นี้ (และสิ่งอื่น ๆ ) จะถูกข้ามไปและเร็วกว่ามาก
foreach ($collection as $product) {
$product->setSomeData(...);
}
$collection->save();
เพื่อหลีกเลี่ยงการอัพเดทราคาแพงคุณสามารถเพิ่ม ...
$product->setIsMassupdate(true);
หากต้องการปิดการใช้งาน / เปิดใช้งาน reindex ได้ทันทีโปรดดูที่ ... 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 microsecs
- รวม CPU (ไมโครไซต์): 423,600 microsecs
- รวม 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 microsecs
- รวม CPU (ไมโครไซต์): 3,122,064 microsecs
- รวม 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 ไมโครวินาที
- รวม CPU (ไมโครไซต์): 48,568 microsecs
- รวม MemUse (ไบต์): 1,426,304 ไบต์
- รวม PeakMemUse (ไบต์): 1,370,456 ไบต์
- จำนวนการเรียกใช้ฟังก์ชัน: 2,221