Cập nhật
Tôi đang tìm kiếm phương pháp nhanh nhất và đáng tin cậy để cập nhật thuộc tính hàng loạt
"Cập nhật thuộc tính khối lượng" cho các thuộc tính hoặc sản phẩm?
Hãy nghĩ rằng việc cập nhật nhiều thuộc tính đã được trả lời, nhưng đối với các sản phẩm thì điều này có thể hữu ích ...
Nếu bạn muốn cập nhật sản phẩm từ bộ sưu tập, bạn không nên làm điều này ...
foreach ($collection as $product) {
$product->setSomeData(...);
# not here
$product->save();
}
Điều này sẽ gửi các sự kiện, xây dựng lại các pricerules và chỉ số. Với điều này, không có sự kiện nào (và một số thứ khác) được bỏ qua và nhanh hơn rất nhiều.
foreach ($collection as $product) {
$product->setSomeData(...);
}
$collection->save();
Để tránh cập nhật đẹp hơn, bạn có thể thêm ...
$product->setIsMassupdate(true);
Để tắt / bật reindex một cách nhanh chóng, hãy xem điều này ... https://github.com/Flagbit/Magento-ChangeAttributionSet/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();
}
}
Và cũng xóa bộ đệm trước khi cập nhật hàng loạt (sản phẩm) có thể tăng hiệu suất ...
Mage::app()->getCacheInstance()->flush();
Một số số từ gỡ lỗi ở đây: https://github.com/Flagbit/Magento-ChangeAttributionSet/issues/16
Mage::getSingleton('catalog/product_action')->updateAttributes(...)
dường như không phải là phương pháp nhanh nhất ... ít nhất là không phải với thiết lập mutlistore và các bảng phẳng được bật ...
saveAttribute()
$product = Mage::getModel('catalog/product')->load($productId);
$resource = $product->getResource();
$product->setData($attributeCode, $attributeValue);
$resource->saveAttribute($product, $attributeCode);
- Tổng số bao gồm Thời gian treo tường (microsec): 437.787 microsec
- Tổng số bao gồm CPU (microsec): 423.600 microsec
- Tổng số bao gồm MemUse (byte): 4,433,848 byte
- Tổng số bao gồm PeakMemUse (byte): 4.395.128 byte
- Số lượng cuộc gọi chức năng: 25.711
updateAttributes()
Mage::getSingleton('catalog/product_action')->updateAttributes(
array($productId),
array($attributeCode => $attributeValue),
$storeId
);
- Tổng số bao gồm Thời gian treo tường (microsec): 3.676.950 microsec
- Tổng số bao gồm CPU (microsec): 3.122.064 microsec
- Tổng số bao gồm MemUse (byte): 8,174,792 byte
- Tổng số bao gồm PeakMemUse (byte): 8.199.192 byte
- Số lượng cuộc gọi chức năng: 150.132
updateAttributes()
(tài nguyên đơn)
Mage::getResourceSingleton('catalog/product_action')->updateAttributes(
array($productId),
array( $attributeCode => $attributeValue),
$storeId
);
- Tổng số bao gồm Thời gian treo tường (microsec): 94.155 microsec
- Tổng số bao gồm CPU (microsec): 48.568 microsec
- Tổng số bao gồm MemUse (byte): 1.426.304 byte
- Tổng số bao gồm PeakMemUse (byte): 1,370,456 byte
- Số lượng các cuộc gọi chức năng: 2.221