Mise à jour
Je recherche la méthode la plus rapide et fiable pour la mise à jour des attributs de masse
"Mise à jour massive des attributs" pour les attributs ou les produits?
Pensez à mettre à jour plusieurs attributs est déjà répondu, mais pour les produits, cela peut être utile ...
Si vous souhaitez mettre à jour des produits de la collection, vous ne devriez pas le faire ...
foreach ($collection as $product) {
$product->setSomeData(...);
# not here
$product->save();
}
Cela enverra les événements, reconstruira les prix et les indices. Avec cela, aucun événement (et d'autres choses) n'est ignoré et est beaucoup plus rapide.
foreach ($collection as $product) {
$product->setSomeData(...);
}
$collection->save();
Pour éviter les mises à jour de prix, vous pouvez ajouter ...
$product->setIsMassupdate(true);
Pour désactiver / activer la réindexation à la volée, jetez un œil à ceci ... 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();
}
}
Et vider le cache avant la mise à jour en masse (produit) peut augmenter les performances ...
Mage::app()->getCacheInstance()->flush();
Quelques chiffres du débogage ici: https://github.com/Flagbit/Magento-ChangeAttributeSet/issues/16
Mage::getSingleton('catalog/product_action')->updateAttributes(...)
ne semble pas être la méthode la plus rapide ... du moins pas avec la configuration mutlistore et les tables plates activées ...
saveAttribute()
$product = Mage::getModel('catalog/product')->load($productId);
$resource = $product->getResource();
$product->setData($attributeCode, $attributeValue);
$resource->saveAttribute($product, $attributeCode);
- Total incl. Temps de mur (microsec): 437,787 microsecs
- Total incl. CPU (microsecs): 423 600 microsecs
- Total incl. MemUse (octets): 4 433 848 octets
- Total incl. PeakMemUse (octets): 4 395 128 octets
- Nombre d'appels de fonction: 25 711
updateAttributes()
Mage::getSingleton('catalog/product_action')->updateAttributes(
array($productId),
array($attributeCode => $attributeValue),
$storeId
);
- Total incl. Temps de paroi (microsec): 3,676,950 microsecs
- Total incl. CPU (microsecs): 3,122,064 microsecs
- Total incl. MemUse (octets): 8,174,792 octets
- Total incl. PeakMemUse (octets): 8 199 192 octets
- Nombre d'appels de fonction: 150 132
updateAttributes()
(ressource singleton)
Mage::getResourceSingleton('catalog/product_action')->updateAttributes(
array($productId),
array( $attributeCode => $attributeValue),
$storeId
);
- Total incl. Durée du mur (microsecondes): 94 155 microsecondes
- Total incl. CPU (microsecs): 48,568 microsecs
- Total incl. MemUse (octets): 1 426 304 octets
- Total incl. PeakMemUse (octets): 1 370 456 octets
- Nombre d'appels de fonction: 2 221