更新
質量属性更新のための最速かつ信頼性の高い方法を探しています
属性または製品の「質量属性更新」?
複数の属性を更新することはすでに回答されていると思いますが、製品の場合、これは便利です...
コレクションから製品を更新する場合、これを行うべきではありません...
foreach ($collection as $product) {
$product->setSomeData(...);
# not here
$product->save();
}
これにより、イベントがディスパッチされ、価格ルールとインデックスが再構築されます。これにより、イベント(およびその他のこと)はスキップされず、はるかに高速になります。
foreach ($collection as $product) {
$product->setSomeData(...);
}
$collection->save();
価格ルールの更新を避けるために、次を追加できます...
$product->setIsMassupdate(true);
オンザフライでインデックスの再作成を無効/有効にするには、こちらをご覧ください ... 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();
}
}
また、大量の(製品)更新の前にキャッシュをフラッシュすると、パフォーマンスが向上する可能性があります...
Mage::app()->getCacheInstance()->flush();
ここでのデバッグからの数:https : //github.com/Flagbit/Magento-ChangeAttributeSet/issues/16
Mage::getSingleton('catalog/product_action')->updateAttributes(...)
最速の方法ではないようです...少なくともマルチストア設定とフラットテーブルが有効になっていないと...
saveAttribute()
$product = Mage::getModel('catalog/product')->load($productId);
$resource = $product->getResource();
$product->setData($attributeCode, $attributeValue);
$resource->saveAttribute($product, $attributeCode);
- 合計を含む ウォールタイム(マイクロ秒):437,787マイクロ秒
- 合計を含む CPU(マイクロ秒):423,600マイクロ秒
- 合計を含む MemUse(バイト):4,433,848バイト
- 合計を含む PeakMemUse(バイト):4,395,128バイト
- 関数呼び出しの数:25,711
updateAttributes()
Mage::getSingleton('catalog/product_action')->updateAttributes(
array($productId),
array($attributeCode => $attributeValue),
$storeId
);
- 合計を含む ウォールタイム(マイクロ秒):3,676,950マイクロ秒
- 合計を含む CPU(マイクロ秒):3,122,064マイクロ秒
- 合計を含む MemUse(バイト):8,174,792バイト
- 合計を含む PeakMemUse(バイト):8,199,192バイト
- 関数呼び出しの数:150,132
updateAttributes()
(リソースシングルトン)
Mage::getResourceSingleton('catalog/product_action')->updateAttributes(
array($productId),
array( $attributeCode => $attributeValue),
$storeId
);
- 合計を含む ウォールタイム(マイクロ秒):94,155マイクロ秒
- 合計を含む CPU(マイクロ秒):48,568マイクロ秒
- 合計を含む MemUse(バイト):1,426,304バイト
- 合計を含む PeakMemUse(バイト):1,370,456バイト
- 関数呼び出しの数:2,221