2012-06-18 56 views
2

有什麼辦法可以加快這個Magento代碼?目前它正在瀏覽大約2k種產品,大約需要20分鐘才能運行。任何方式來加快這個Magento代碼?

我猜這個問題是圍繞產品 - >負載()調用,但我不夠熟悉Magento知道它需要的開銷。

謝謝。

從控制器

Mage::dispatchEvent(
    'category_rule_save', 
    array(
     'rule_id'  => $id, 
     'attribute_code' => $data['attribute_code'], 
     'operator'  => $data['operator'], 
     'value'   => $data['value'], 
     'category_id' => $data['category'], 
     'store_id'  => $data['store_id'] 
    ) 
); 

從Observer.php

public function onCategoryRuleSave($observe) 
{ 
    $collection = 
     Mage::getModel('catalog/product')->getCollection() 
      ->addAttributeToSelect($observe['attribute_code']); 
    $write = Mage::getSingleton('core/resource')->getConnection('core_write'); 

    foreach ($collection as $product) { 
     $productId = $product->getId(); 
     $product = $product->load($productId); 
     $productAttributeValue = ''; 
     $productAttributeValue = 
      Mage::getModel('catalog/product')->load($productId) 
       ->getAttributeText($observe['attribute_code']); 
     $r = 0; 

     if (is_numeric($observe['value'])) { 
      switch($observe['operator']) { 
       case "<": 
        $r = ($productAttributeValue < $observe['value']) ? 1 : 0; 
        break; 
       case ">": 
        $r = ($productAttributeValue > $observe['value']) ? 1 : 0; 
        break; 
       case "<=": 
        $r = ($productAttributeValue <= $observe['value']) ? 1 : 0; 
        break; 
       case ">=": 
        $r = ($productAttributeValue >= $observe['value']) ? 1 : 0; 
        break; 
       case "==": 
        $r = ($productAttributeValue == $observe['value']) ? 1 : 0; 
        break; 
       case "!=": 
        $r = ($productAttributeValue != $observe['value']) ? 1 : 0; 
        break; 
      } 
     } 
     else { 
      switch($observe['operator']) { 
       case "==": 
        $r = (
         strcmp(strtolower($productAttributeValue) , strtolower($observe['value'])) == 0 
        ) ? 1 : 0; 
        break; 
       case "!=": 
        $r = (
         strtolower($productAttributeValue) != strtolower($observe['value']) 
        ) ? 1 : 0; 
        break; 
      } 
     } 

     if ($r==1) { 
      $write->query(
       "REPLACE INTO `catalog_category_product` (`category_id`, `product_id`) 
       VALUES (" . $observe['category_id'] . "," . $product->getId() . ")" 
      ); 
     } 
    } 
} 

回答

1

嘗試用替代產品裝載:

... 
foreach ($collection as $product) { 
$productAttributeValue = $product->getAttributeText($observe['attribute_code']); 
$r = 0; 
... 

你加載一個產品對象2周額外的時間。 foreach中的$ product變量已經是您需要使用的屬性的加載產品。鑑於Magento的EAV數據庫結構,加載具有所有屬性的$ product對象是很昂貴的。

+0

謝謝。這將時間從約20分鐘降低到約5分鐘。 –

+1

您還會注意到一個很大的速度差異,取決於您運行代碼的硬件以及MySQL安裝的優化(稍微超出了問題範圍)。如果它解決了您的問題,請隨時單擊答案旁邊的複選標記以接受它;) – Roscius

+0

更新。刪除了額外的產品 - >負載。這將時間縮短到〜5秒。再次,謝謝! –

0

 
1.$collection = 
     Mage::getModel('catalog/product')->getCollection() 
     ->addAttributeToSelect($observe['attribute_code']);

2.Mage::getModel('catalog/product')->load($productId) ->getAttributeText($observe['attribute_code']);

3.$product = $product->load($productId);

那可真是可怕:)

 
$collection = 
     Mage::getModel('catalog/product')->getCollection() 
     ->addAttributeToSelect('*');//this string should load all of the product attributes 
也有一些方法來增加產品的網站,產品存儲設備和其他一些。

相關問題