Güncelleme
Toplu özellik güncellemesi için en hızlı ve güvenilir yöntemi arıyorum
Özellikler veya ürünler için "toplu özellik güncellemesi"?
Birden fazla özelliği güncellemenin yanıtlandığını düşünün, ancak ürünler için bu yararlı olabilir ...
Ürünleri koleksiyondan güncellemek istiyorsanız, bunu yapmamalısınız ...
foreach ($collection as $product) {
$product->setSomeData(...);
# not here
$product->save();
}
Bu olayları gönderir, fiyatçıları ve endeksleri yeniden oluşturur. Bununla hiçbir olay (ve diğer bazı şeyler) atlanmaz ve çok daha hızlıdır.
foreach ($collection as $product) {
$product->setSomeData(...);
}
$collection->save();
Fiyatlandırma güncellemelerinden kaçınmak için şunu ekleyebilirsiniz ...
$product->setIsMassupdate(true);
Reindex'i anında devre dışı bırakmak / etkinleştirmek için şuna bir göz atın ... 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();
}
}
Ayrıca, toplu (ürün) güncellemeden önce önbelleği temizlemek performansı artırabilir ...
Mage::app()->getCacheInstance()->flush();
Hata ayıklama işleminden bazı numaralar: https://github.com/Flagbit/Magento-ChangeAttributeSet/issues/16
Mage::getSingleton('catalog/product_action')->updateAttributes(...)
en hızlı yöntem gibi görünmüyor ... en azından mutlistore kurulumu ve düz tablolar açıkken değil ...
saveAttribute()
$product = Mage::getModel('catalog/product')->load($productId);
$resource = $product->getResource();
$product->setData($attributeCode, $attributeValue);
$resource->saveAttribute($product, $attributeCode);
- Toplam Dahil Duvar Zamanı (microsec): 437,787 microsec
- Toplam Dahil İşlemci (microsecs): 423.600 microsecs
- Toplam Dahil MemUse (bayt): 4.433.848 bayt
- Toplam Dahil PeakMemUse (bayt): 4,395,128 bayt
- İşlev Çağrı Sayısı: 25.711
updateAttributes()
Mage::getSingleton('catalog/product_action')->updateAttributes(
array($productId),
array($attributeCode => $attributeValue),
$storeId
);
- Toplam Dahil Duvar Süresi (mikrosaniye): 3,676,950 mikrosaniye
- Toplam Dahil İşlemci (microsecs): 3.122.064 microsecs
- Toplam Dahil MemUse (bayt): 8.174.792 bayt
- Toplam Dahil PeakMemUse (bayt): 8.199.192 bayt
- İşlev Çağrı Sayısı: 150.132
updateAttributes()
(kaynak tekil)
Mage::getResourceSingleton('catalog/product_action')->updateAttributes(
array($productId),
array( $attributeCode => $attributeValue),
$storeId
);
- Toplam Dahil Duvar Süresi (mikro saniye): 94.155 mikro saniye
- Toplam Dahil İşlemci (microsecs): 48.568 microsecs
- Toplam Dahil MemUse (bayt): 1.426.304 bayt
- Toplam Dahil PeakMemUse (bayt): 1,370,456 bayt
- İşlev Çağrı Sayısı: 2.221