2013-11-03 31 views
1

我不知道我是否在問這個問題。我需要加載一個產品,改變一些值並保存。我的問題是哪一種方式是適當做it.Currently我使用這種方式:在magento中加載模型更好嗎?

$id = Mage::getModel('catalog/product')->getIdBySku($sku); 
$product = Mage::getModel('catalog/product')->load($id); 

1)一般情況下能正常工作,即使40K products.But我讀了這種方式導致內存泄漏?我也讀過這個解決方案,如果我禁用reindex功能,我可以改善處理時間。

2)如果我使用另一種方式並加載它作爲一個集合,然後應用一些過濾器,例如addFieldToFilter('sku',$the_product_i_want) 會更好?

當我說得更好時,我的意思是:1)magento的方式,2)有效率的時間3)沒有做我不需要做的事情。

+0

我想說你似乎在混合的概念。 addFieldToFilter - 關於集合。 Mage :: getModel('catalog/product') - > load() - 與模型有關。我認爲你的問題的「正確」形式是 - 什麼是最好的:1)首先從db加載所有產品,然後通過php過濾需要處理的內容2)通過mysql過濾所需產品(這是addFieldToFilter做的),然後更新所有加載的產品,然後答案是第二選項。 –

+0

如果我這樣做:Mage :: getModel('catalog/product') - > load()我加載所有產品?因爲我打電話給模型產品?即使我使用id加載一個產品?對我的問題抱歉但我想更好地理解Magento。 @羅布 – vbak

+1

啊,明白了。那麼,model-> load()是加載模型的方法。 「模型」概念大致上就像數據結構的單個實例一樣。即product是數據結構,當你調用 - > load($ id)時,通過給定的$ id從db中獲取數據來填充該結構。雖然addFieldToFilter適用於集合,但不適用於模型。集合概念 - 是一組產品,通過一次請求從DB獲取(大多數情況下,通常集合是抽象的,意味着一組單一實例)。所以,當你做 - > addFieldToFilter,你添加條件到你的集合的請求 –

回答

4

每次你調用下面的代碼片段Mage::getModel('catalog/product') Magento會在內存中創建一個新的模型對象。這會導致內存泄漏。你可以做如下。

$model = Mage::getModel('catalog/product'); 
$id = $model->getIdBySku($sku); 
$product = $model->load($id); 

同時if you have the product object你可以使用下面的代碼。

$collection = Mage::getModel('catalog/product')->getCollection(); 
$product = $collection->addFieldToFilter('sku',$the_product_i_want); 
+5

準確地說,這不會導致經典的內存泄漏,就像您可能在C中發現的那樣,但它可能導致高內存使用率。 – siliconrockstar

+1

但它影響到性能 – Sukeshini

相關問題