2016-05-23 4 views
2

Ich importiere Daten (Produkte, Kunden und Bestellungen) von einem Magento Store in einen anderen Magento Store.Wie zu beheben Speicherverluste in Magento im Zusammenhang mit load() -Methode?

Zum Beispiel, wenn ich versuche, die Produkte zu importieren, muss ich das Produkt laden, um zu überprüfen, ob es bereits existiert und einige Attribute des geladenen Produkts verwenden. Ich verwende die Methode Mage :: getModel ('catalog/product') -> load ($ sku) und ich führe das Skript über die Befehlszeile aus.

Etwas wie: $ php -f shell/mymodule.php

Das Problem ist, dass Magento stoppt nicht die Speichernutzung zu erhöhen, wenn ich die Methode load() in einer Schleife verwenden.

foreach ($result['items'] as $item) { 
    echo $index . ' - Memory: ' . memory_get_usage() . "\n"; 

    /** @var Mage_Catalog_Model_Product $product */ 
    $product = Mage::getModel('catalog/product'); 
    $product->load($product->getIdBySku($item['sku'])); 

    $product->getOptionInstance()->unsetOptions()->clearInstance(); 
    unset($product); 
    gc_collect_cycles(); 

    $index++; 
} 
  • 1 - Speicher: 28.147.376
  • 2 - Speicher: 34.600.320
  • 3 - Speicher: 34.661.976
  • 4 - Speicher: 34.721.128
  • 5 - Memory: 34776600
  • . ..
  • 10 - Speicher: 35051216
  • ...
  • 100 - Arbeitsspeicher: 40148904

In einigen Fällen brauche ich Tausende von Produkten zu importieren, die einen Speicherüberlauf verursacht. Wie Sie im obigen Skript sehen können, habe ich auch versucht, einige Optimierungsfunktionen innerhalb der foreach auszuführen, aber das reicht nicht aus, um einen Speicherüberlauf zu verhindern.

$product->getOptionInstance()->unsetOptions()->clearInstance(); 
unset($product); 
gc_collect_cycles(); 

fand ich eine Art von Lösung, die Magento Kern ändert, aber es war für Magento 1.4 und funktioniert nicht für Magento 1.9, die ich verwende gemacht.

https://ringsdorff.net/2009/07/23/guest-post-fix-for-memory-leaks-in-magento/

Gibt es eine effektive Lösung, um die Erhöhung der Speichernutzung in Magento 1.9 zu verhindern?

+0

Versuchen Sie zu überprüfen, wie Magento Walk() Funktion funktioniert. Es ist ein Iterator durch Sammlung. Sie können einen Hinweis finden, wie Sie dies vermeiden können. –

+0

Das Laden innerhalb einer Schleife bewirkt, dass der verwendete Speicher für jede Iteration bis zur Fertigstellung oder Speichererschöpfung um die Größe der Sammlung erhöht wird, je nachdem, was zuerst eintritt. http://magento.stackexchange.com/questions/69488/increasing-magento-efficiency-by-loading-outsite-of-looping-structures –

Antwort

1

Sie können Mage verwenden :: getSingleton() -Methode, wird es das Speicherproblem um 50% zu reduzieren und auch versuchen, die Daten in Blöcken auszuführen.

0

versuchen Mage::getSingleton('catalog/product'); statt Mage::getModel('catalog/product');

Verwandte Themen