Magento: обновление каталогов продуктов быстрее - PullRequest
7 голосов
/ 17 ноября 2011

Я написал довольно много сценариев для обновления каталога товаров на основе того или иного параметра. В каждой из них базовая логика является чем-то похожим на это ...

     //Get collection
     $collection = Mage::getModel('catalog/product')->getCollection();
     $collection->addAttributeToSelect('sku');
 $collection->addAttributeToSelect('publihser');
     $collection->addFieldToFilter(array(array('attribute'=>'publisher','eq'=>$publisher)));

     // for each product in collection do a individual save
     foreach ($collection as $product) {
    $product->setSKU($newValue);
    $product->save();   
            }

Хотя эта работа, каждое сохранение представляет собой запрос на обновление SQL, и дело в том, что, имея очень большой каталог, это довольно медленно.

Мне было интересно, можно ли это ускорить, сделав единственное сохранение в коллекции, а не в продукте.

1 Ответ

21 голосов
/ 18 ноября 2011

Есть несколько вещей, которые вы можете сделать, чтобы написать гораздо более быстрый скрипт обновления. Я не знаю, как вы получаете некоторые из ваших переменных, поэтому вам нужно будет изменить их, чтобы они работали в вашем случае, но приведенный ниже код должен быть намного быстрее, чем тот, которым вы сейчас занимаетесь. например:

// Set indexing to manual before starting updates, otherwise it'll continually get slower as you update
$processes = Mage::getSingleton('index/indexer')->getProcessesCollection();
$processes->walk('setMode', array(Mage_Index_Model_Process::MODE_MANUAL));
$processes->walk('save');

// Get Collection
$collection = Mage::getModel('catalog/product')->getCollection()
    ->addAttributeToSelect('sku')
    ->addAttributeToSelect('publihser')
    ->addFieldToFilter(array(array('attribute'=>'publisher','eq'=>$publisher)));


function productUpdateCallback($args){
    $product = Mage::getModel('catalog/product');

    $product->setData($args['row']);

    $productId = $product->getId();

    $sku = 'yourSku';

    // Updates a single attribute, much faster than calling a full product save
    Mage::getSingleton('catalog/product_action')
        ->updateAttributes(array($productId), array('sku' => $sku), 0);
}

// Walk through collection, for large collections this is much faster than using foreach
Mage::getSingleton('core/resource_iterator')->walk($collection->getSelect(), array('productUpdateCallback'));


// Reindex all
$processes->walk('reindexAll');
// Set indexing back to realtime, if you have it set to manual normally you can comment this line out
$processes->walk('setMode', array(Mage_Index_Model_Process::MODE_REAL_TIME));
$processes->walk('save');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...