2012-06-18 3 views
2

이 Magento 코드의 속도를 높이는 방법이 있습니까? 현재 약 2k 제품을 조사 중이며 약 20 분이 걸립니다.이 Magento 코드의 속도를 향상시키는 방법은 무엇입니까?

나는이 문제가 제품 -> load() 호출과 관련이 있다고 생각하지만 충분한 오버 헤드를 알고 자 Magento에 익숙하지 않다.

감사합니다. Observer.php에서 컨트롤러

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'] 
    ) 
); 

에서

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

는 상품로드를 교체하십시오 : 당신은 제품 객체 2 여분의 시간을로드하는

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

. foreach에있는 $ product 변수는 이미 작업해야하는 속성이있는로드 된 제품입니다. Magento의 EAV 데이터베이스 구조에서 모든 속성을 가진 $ product 객체를로드하는 것은 비용이 많이 든다.

 
$collection = 
     Mage::getModel('catalog/product')->getCollection() 
     ->addAttributeToSelect('*');//this string should load all of the product attributes 
또한 제품 웹 사이트, 제품 저장 및 몇몇 다른 사람을 추가 할 수있는 몇 가지 방법이 있었다 :) 정말 끔찍

+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);

.

관련 문제