2011-06-02 61 views
1

我正在寫一個magento產品導出程序,它將幾個屬性寫入一個csv文件。一個屬性被稱爲「類字符串」,其方法是這樣的:magento內存問題,無法取消設置對象

... 
foreach($products as $_product) {  
     ... 

     $productId  = $_product->getSku(); 
     $productCategory = getCategoryString($_product['category_ids']); 
     ... 
} 
... 

function getCategoryString($numbers) { 

    $catString = ''; 
    $catModel = Mage::getModel('catalog/category')->setStoreId(Mage_Core_Model_App::ADMIN_STORE_ID); 

    $ex = explode(',', $numbers); 

    foreach ($ex as $i => $e) { 

     if ($i > 0) { 

      $catString .= $catModel->load($e)->getName(); 

      if ($i < (count($ex)-1)) 
       $catString .= ' > '; 
     } 
    } 

    $ex = NULL; 
    $numbers = NULL; 

    $catModel->unsetData(); 
      unset($catModel); 
      $catModel = NULL; 

    return $catString; 
} 

但每次迭代1MB左右的方法,通話費用爲每個產品後,我有大約9000的產品!我無法清理$ catModel變量! $ catModel = NULL和unset($ catModel)行沒有影響。我究竟做錯了什麼?我該如何強制取消對象?!

+0

不加載在得到收集相同的數據,你在這裏做的對象毫無意義的負荷類別 – 2011-06-02 16:39:47

+0

Magento有加載某些模型(如產品和類別)的內存泄漏。你可能最好把它當成一個整數數組並且從那裏開始工作。 – 2011-06-02 16:54:47

+0

迴應Joseph說,PHP在發佈某些循環對象引用和其他深層嵌套對象鏈時保守,這意味着即使您的主對象正在被釋放,其許多子對象也不會被釋放。任何解開這個的人都不適合與世界分享,所以你是SOL。 – 2011-06-02 17:39:33

回答

1

我們對於Magento的cron有同樣的問題,我知道這不是最好的辦法,但我們需要快速做到這一點。

我們的解決方案是使用必要的代碼創建一個新的PHP文件來完成單個操作。從magento我們得到一個產品列表,然後用exec()調用這個外部PHP文件產品。

事情是這樣的:

foreach($products as $_product) {  
     ... 

     exec("do_the_work.php {$_product->getSku()}"); 

     ... 
} 

希望它能幫助。

+0

它不會幫助,除非你喜歡通過屁股修復你的牙齒:)對不起,因爲在這裏粗魯,但這絕對是一個大nono – 2011-06-02 16:40:45

+0

我完全同意你,這是因爲我說:「這不是最好的方式來做它」。 – 2011-06-02 17:12:12

+0

感謝您的解決方法,您是對的「這不是最好的方式」 - 但它是最快的!調用外部php文件處理產品後,一切正常。謝謝! – dixx 2011-06-05 10:12:35

0

使你的腳本會如此冷得多,如果你

  1. 從所有你必須作爲一個數組
  2. 負載類集合在()子句類別名稱,產品得到所有目錄id你需要
  3. 的foreach產品收集更多的時間和選擇neccecary類別的ID從預裝的收集與恰到好處的元素
  4. 利潤$$$$導致您不使用存儲就像它的無限你

非常非常冷的東西就可以直接加入類別名稱產品集合,這將消耗更少的資源