Memperbarui
Saya mencari metode tercepat dan andal untuk pembaruan atribut massal
"Pembaruan atribut massal" untuk atribut atau produk?
Berpikir memperbarui beberapa atribut sudah terjawab, tetapi untuk produk ini dapat bermanfaat ...
Jika Anda ingin memperbarui produk dari koleksi, jangan lakukan ini ...
foreach ($collection as $product) {
$product->setSomeData(...);
# not here
$product->save();
}
Ini akan mengirimkan acara, membangun kembali pricerules dan indeks. Dengan ini tidak ada acara (dan beberapa hal lainnya) yang dilewati dan jauh lebih cepat.
foreach ($collection as $product) {
$product->setSomeData(...);
}
$collection->save();
Untuk menghindari pembaruan pricerule, Anda dapat menambahkan ...
$product->setIsMassupdate(true);
Untuk menonaktifkan / mengaktifkan pengindeksan ulang dengan cepat, lihat ini ... 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();
}
}
Dan juga membersihkan cache sebelum pembaruan massal (produk) dapat meningkatkan kinerja ...
Mage::app()->getCacheInstance()->flush();
Beberapa angka dari debugging di sini: https://github.com/Flagbit/Magento-ChangeAttributeSet/issues/16
Mage::getSingleton('catalog/product_action')->updateAttributes(...)
tampaknya bukan menjadi metode tercepat ... setidaknya tidak dengan pengaturan mutlistore dan tabel datar dihidupkan ...
saveAttribute()
$product = Mage::getModel('catalog/product')->load($productId);
$resource = $product->getResource();
$product->setData($attributeCode, $attributeValue);
$resource->saveAttribute($product, $attributeCode);
- Total Termasuk Waktu Dinding (microsec): 437.787 microsecs
- Total Termasuk CPU (mikrod): 423.600 mikrod
- Total Termasuk MemUse (bytes): 4.433.848 bytes
- Total Termasuk PeakMemUse (bytes): 4,395.128 byte
- Jumlah Panggilan Fungsi: 25.711
updateAttributes()
Mage::getSingleton('catalog/product_action')->updateAttributes(
array($productId),
array($attributeCode => $attributeValue),
$storeId
);
- Total Termasuk Waktu Dinding (microsec): 3.676.950 microsecs
- Total Termasuk CPU (microsecs): 3.122.064 microsecs
- Total Termasuk MemUse (byte): 8,174.792 byte
- Total Termasuk PeakMemUse (byte): 8,199,192 byte
- Jumlah Panggilan Fungsi: 150.132
updateAttributes()
(sumber daya tunggal)
Mage::getResourceSingleton('catalog/product_action')->updateAttributes(
array($productId),
array( $attributeCode => $attributeValue),
$storeId
);
- Total Termasuk Waktu Dinding (microsec): 94.155 microsecs
- Total Termasuk CPU (microsecs): 48.568 microsecs
- Total Termasuk MemUse (bytes): 1.426.304 bytes
- Total Termasuk PeakMemUse (byte): 1,370,456 byte
- Jumlah Panggilan Fungsi: 2.221