Aktualizacja
Szukam najszybszej i niezawodnej metody masowej aktualizacji atrybutów
„Masowa aktualizacja atrybutów” dla atrybutów lub produktów?
Pomyśl, że aktualizacja wielu atrybutów jest już odpowiedzią, ale w przypadku produktów może to być przydatne ...
Jeśli chcesz zaktualizować produkty z kolekcji, nie powinieneś tego robić ...
foreach ($collection as $product) {
$product->setSomeData(...);
# not here
$product->save();
}
Spowoduje to wysłanie zdarzeń, odbudowanie cenników i indeksów. Dzięki temu żadne zdarzenia (i niektóre inne rzeczy) nie są pomijane i są znacznie szybsze.
foreach ($collection as $product) {
$product->setSomeData(...);
}
$collection->save();
Aby uniknąć aktualizacji pricerule, możesz dodać ...
$product->setIsMassupdate(true);
Aby wyłączyć / włączyć reindeks w locie, spójrz na to ... 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();
}
}
A także opróżnianie pamięci podręcznej przed aktualizacją masową (produktu) może zwiększyć wydajność ...
Mage::app()->getCacheInstance()->flush();
Niektóre liczby z debugowania tutaj: https://github.com/Flagbit/Magento-ChangeAttributeSet/issues/16
Mage::getSingleton('catalog/product_action')->updateAttributes(...)
wydaje się nie być najszybszą metodą ... przynajmniej nie z włączoną konfiguracją listy odtwarzania i włączonymi płaskimi stołami ...
saveAttribute()
$product = Mage::getModel('catalog/product')->load($productId);
$resource = $product->getResource();
$product->setData($attributeCode, $attributeValue);
$resource->saveAttribute($product, $attributeCode);
- Razem Czas ścienny (mikrosekund): 437,787 mikrosekund
- Razem Procesor (mikrosekundy): 423,600 mikrosekund
- Razem MemUse (bajty): 4 433 848 bajtów
- Razem PeakMemUse (bytes): 4,395,128 bajtów
- Liczba wywołań funkcji: 25 711
updateAttributes()
Mage::getSingleton('catalog/product_action')->updateAttributes(
array($productId),
array($attributeCode => $attributeValue),
$storeId
);
- Razem Czas ścienny (mikrosekund): 36676,950 mikrosekund
- Razem Procesor (mikrosekundy): 3 122 064 mikrosekund
- Razem MemUse (bytes): 8,174,792 bajtów
- Razem PeakMemUse (bytes): 8 199,192 bajtów
- Liczba wywołań funkcji: 150,132
updateAttributes()
(singleton zasobów)
Mage::getResourceSingleton('catalog/product_action')->updateAttributes(
array($productId),
array( $attributeCode => $attributeValue),
$storeId
);
- Razem Czas ścienny (mikrosekund): 94155 mikrosekund
- Razem Procesor (mikrosekundy): 48 568 mikrosekund
- Razem MemUse (bytes): 1426304 bajty
- Razem PeakMemUse (bytes): 1.370,456 bajtów
- Liczba wywołań funkcji: 2221