Aggiornare
Sto cercando il metodo più rapido e affidabile per l'aggiornamento degli attributi di massa
"Aggiornamento degli attributi di massa" per attributi o prodotti?
Pensa che sia sempre stata data risposta all'aggiornamento di più attributi, ma per i prodotti questo può essere utile ...
Se desideri aggiornare i prodotti dalla raccolta, non dovresti farlo ...
foreach ($collection as $product) {
$product->setSomeData(...);
# not here
$product->save();
}
Questo invierà eventi, ricostruirà pricerules e indici. Con questo nessun evento (e alcune altre cose) vengono saltati ed è molto più veloce.
foreach ($collection as $product) {
$product->setSomeData(...);
}
$collection->save();
Per evitare gli aggiornamenti dei pricerule, puoi aggiungere ...
$product->setIsMassupdate(true);
Per disabilitare / abilitare reindex al volo dai un'occhiata a questo ... 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();
}
}
E anche lo svuotamento della cache prima dell'aggiornamento di massa (prodotto) può aumentare le prestazioni ...
Mage::app()->getCacheInstance()->flush();
Alcuni numeri dal debug qui: https://github.com/Flagbit/Magento-ChangeAttributeSet/issues/16
Mage::getSingleton('catalog/product_action')->updateAttributes(...)
sembra non essere il metodo più veloce ... almeno non con l'installazione di mutlistore e le tabelle piatte attivate ...
saveAttribute()
$product = Mage::getModel('catalog/product')->load($productId);
$resource = $product->getResource();
$product->setData($attributeCode, $attributeValue);
$resource->saveAttribute($product, $attributeCode);
- Totale incl. Wall Time (microsec): 437.787 microsec
- Totale incl. CPU (microsec): 423.600 microsec
- Totale incl. MemUse (byte): 4.433.848 byte
- Totale incl. PeakMemUse (byte): 4.395.128 byte
- Numero di chiamate di funzione: 25.711
updateAttributes()
Mage::getSingleton('catalog/product_action')->updateAttributes(
array($productId),
array($attributeCode => $attributeValue),
$storeId
);
- Totale incl. Wall Time (microsec): 3.676.950 microsec
- Totale incl. CPU (microsec): 3.122.064 microsec
- Totale incl. MemUse (byte): 8.174.792 byte
- Totale incl. PeakMemUse (byte): 8.199.192 byte
- Numero di chiamate di funzione: 150.132
updateAttributes()
(risorsa singleton)
Mage::getResourceSingleton('catalog/product_action')->updateAttributes(
array($productId),
array( $attributeCode => $attributeValue),
$storeId
);
- Totale incl. Wall Time (microsec): 94.155 microsecs
- Totale incl. CPU (microsec): 48.568 microsec
- Totale incl. MemUse (byte): 1.426.304 byte
- Totale incl. PeakMemUse (byte): 1.370.456 byte
- Numero di chiamate di funzione: 2.221