Tagarchiv: ERP

Gastbeitrag: Fix für Speicherlecks in Magento

Import Test
Mit dem Fix sind auch Importe von mehreren tausend Artikeln in eigenen Schnittstellen kein Problem mehr.

Beim Import von Produktdaten in ein Shopsystem müssen nicht selten tausende von Datensätzen eingelesen werden. Hierzu bietet Magento DataFlow an, mit dem sich Produkte aus CSV-Dateien oder Excel-XML-Dateien über ein zuvor festgelegtes Schema importieren lassen. Für viele Shops reicht diese Lösung allerdings nicht aus, da häufig direkte Anbindungen an ERP-Systeme oder PIM-Lösungen benötigt werden. Daher kommen insbesondere bei großen Shops indivuelle Schnittstellen zum Einsatz, die entweder direkt innerhalb von Magento oder über die API arbeiten. Aufgrund eines Speicherlecks im Magento Core führt der Import großer Datenmengen auf diesem Weg allerdings schnell dazu, dass der zur Verfügung stehende Arbeitsspeicher vollläuft und der Import abbricht.

memory_error
Ungeliebte Fehlermeldung: Der verfügbare Arbeitsspeicher ist vollgelaufen

Doch nicht nur beim Import kann dieses Problem auftreten. Mit einem kleinen Test kann man auch beim Laden eines Produktes erkennen, dass der Speicher volläuft:

<?php
for($i=1;$i<=100;$i++)
{
    $product = Mage::getModel('catalog/product')->load(0);
}
?>

Hier wird 100 Mal ein Product Model geladen. Lässt man sich nun bei jedem Schleiferndurchlauf mit memory_get_usage() den Speicherverbrauch anzeigen, sieht man das Problem sehr deutlich:

Product Load Memory Leak
Der Speicherverbrauch steigt pro Durchlauf an – im schlimmsten Fall bis zum Abbruch

Die Ursache der Speicherlecks liegt darin begründet, dass der in PHP integrierte Garbage Collector nicht in der Lage ist, sogenannte Circular References in Objekten zu verarbeiten. Das führt dazu, dass diese Speicherbereiche nicht automatisch freigegeben werden, und genau das führt dann zu einem kontinuierlichen Anstieg des verwendeten Arbeitsspeichers. Um dieses Problem zu umgehen, müssen solche Objekte zur Laufzeit manuell freigegeben werden. Ausführliche Informationen zur Circular References in PHP gibt es hier (jeweils englisch):

http://derickrethans.nl/circular_references.php
http://paul-m-jones.com/?p=262

Der Fix

Wir bei Visions haben dieses Problem analysiert und einen kleinen aber wirkungsvollen Fix erarbeitet. Er wird derzeit von den Magento-Entwicklern bei Varien getestet und voraussichtlich bis zum nächsten Release in den Magento Core aufgenommen. Bis dahin können Sie den Fix auch selbst in Ihr System integrieren. Aber Vorsicht: Trotz sorgfältiger Tests können wir keine Garantie für die korrekte Funktion in Ihrer Magento-Installation übernehmen! Bis zur Aufnahme in den Magento Core sollten Sie den Fix keinesfalls auf Produktivsystemen einsetzen.

In der Datei app/code/core/Mage/Eav/Model/Entity/Attribute/Abstract.php wird die neue Funktion __destruct() eingefügt:

public function __destruct()
{
    unset($this->_backend);
}

Diese wird in der Datei app/code/Mage/Eav/Model/Entity/Abstract.php in der Funktion walkAttributes() benötigt. Suchen Sie nach dem Code-Block

catch (Exception $e) {
$exception = new Mage_Eav_Model_Entity_Attribute_Exception($e->getMessage());
$exception->setAttributeCode($attrCode)->setPart($part);
throw $exception;
}

und fügen Sie direkt dahinter die folgende Zeile ein:

$attribute->__destruct();

Außerdem wird in der Funktion _collectSaveData() hinter dem Code-Block

elseif (!$attribute->isValueEmpty($v)) {
    $insert[$attrId] = $v;
}

die folgende Zeile eingefügt:

$this->unsetAttributes();

Das war schon alles! Ein erneuter Test zeigt dass der Speicherverbrauch nun konstant ist:

Product Load Fixed
Mit dem Fix bleibt der Speicherverbrauch konstant.

Über den Autor
Sebastian Heuer ist Entwickler bei Visions und arbeitet seit Juni 2008 an Magento Projekten.

Guest Post: Fix for Memory Leaks in Magento

Import Test
With this fix, importing thousands of products with your own scripts won’t be a problem anymore

Importing products into an e-commerce system means dealing with thousands of data records. Magento offers DataFlow for this task, where you can import products from CSV or Excel-XML files using a profile you defined before. Unfortunately this solution is not flexible enough for many stores, as they often require direct access to ERP systems or PIM software. This is why most of the bigger stores use self-engineered interfaces running from within Magento or using the API. This way is much more flexible than DataFlow, but currently there is one huge drawback: Due to some memory leaks in the Magento core, importing big amounts of data leads to crashes when the available memory is exhausted.

memory_error
Not welcome: The allocated memory is exhausted because of memory leaks.

But this does not only happen while importing data. With this little test you can easily watch the memory consumption grow:

<?php
for($i=1;$i<=100;$i++)
{
    $product = Mage::getModel('catalog/product')->load(0);
}
?>

This loads a product model 100 times. Using memory_get_usage() to output the used memory, the problem gets clear:

Product Load Memory Leak
Memory consumption grows with each run – until the script crashes in the worst case

The cause for the memory leaks lies within the garbage collector integrated in PHP. It can not handle so called „circular references“ in complex objects, so the allocated memory for those objects will not be freed. A workaround for this problem is to manually free the objects during runtime. For more information on the circular reference problem in PHP visit these sites:

http://derickrethans.nl/circular_references.php
http://paul-m-jones.com/?p=262

The Fix

We here at Visions have analysed the problem and wrote a simple yet working fix for it. It is currently reviewed and tested over at Varien and will most likely be included into the next Magento release. If you don’t want to wait, you can fix your Magento installation for yourself. But be warned: Though thoroughly tested, we can not guarantee for this to work in your environment! Do not use this on a productive system!

First you need to add the function __destruct() to the file app/code/core/Mage/Eav/Model/Entity/Attribute/Abstract.php:

public function __destruct()
{
    unset($this->_backend);
}

This will be used in the walkAttributes() function within the file app/code/Mage/Eav/Model/Entity/Abstract.php. Look for this code:

catch (Exception $e) {
$exception = new Mage_Eav_Model_Entity_Attribute_Exception($e->getMessage());
$exception->setAttributeCode($attrCode)->setPart($part);
throw $exception;
}

and append the following line:

$attribute->__destruct();

Additionally, find this code within the _collectSaveData() function:

elseif (!$attribute->isValueEmpty($v)) {
    $insert[$attrId] = $v;
}

and append the following line:

$this->unsetAttributes();

And that’s it! Another test shows constant memory consumption now:

Product Load Fixed
Constant memory usage with the fix.

About the author
Sebastian Heuer has been working on Magento projects since June 2008. He works as a developer for Visions.

Open Source setzt sich im Enterprise Segment durch!

In einer heute veröffentlichten Präsentation von Matt Asay wird eindrucksvoll am Beispiel von Openbravo geschildert wie eine „commercial open-source community“ aufgebaut werden sollte.

Besonders interessant finde ich die Ergebnisse der aufgeführten Umfragen:

  • Geplanter Einsatz von Open Source Applikationssoftware in 53% der befragten Unternehmen bis 2010 (siehe Folie 3)
  • Top 5 Entscheidungskriterien sind: Niedrige Gesamt-, Lizenz- sowie Supportkosten, offener Entwicklungsprozess und offener Quellcode (siehe Folie 5)
  • Neben Kostenersparnissen steht auch die Risikoreduktion im Vordergrund der Entscheidungen
  • 92% der Unternehmen geben an, dass sie durch den Einsatz von Open Source eine Qualitätssteigerung erzielen konnten (siehe Folie 8 )

Erst vor kurzem hatte ich mich in einer Diskussion bei Xing gegen die Aussage gewehrt, dass Open Source nicht Enterprise sein kann. Diese Denkweise scheint jedoch aus dem Bereich der rein kommerziellen Softwareanbieter noch stark verbreitet zu werden.

Auch Heise berichtete vor kurzem über die Verbreitung von Open Source im Enterprise Bereich mit Bezug auf die gleiche Studie, die Matt Asays Präsentation zugrunde liegt. Ebenfalls sehr lesenswert in diesem Zusammenhang ist die Trendstudie Open Source von Dr. Oliver Diedrich.

Nach all diesen guten Zeichen für Open Source Software bin ich besonders gespannt wie sich die Lösungen im Bereich des e-Commerce (Magento, Oxid, PrestaShop und FWP) mittelfristig gegen die kommerziellen Anbieter (Intershop, Hybris, IBM Websphere und Venda) schlagen werden. Weitere spannende Projekte führender e-Commerce Händler auf Basis von Open Source Lösungen wurden zwischen den Zeilen ja bereits angekündigt.