de_DEus

Produktimport mit Magento

Vergleich der wichtigsten Importmethoden

Um Produkte in Magento zu importieren, gibt es verschiedene Möglichkeiten, die in diesem Artikel verglichen werden. Er basiert auf dem Vortrag Importing Products into Magento von der Meet Magento NL 2014. Dabei werden in Magento integrierte Methoden mit den populärsten externen Modulen verglichen. Als weiterführende Literatur empfehle ich die Artikelserie „Import-Geschwindigkeit von Artikeln in Magento“ von Matthias Zeis, die auf einige der hier ebenfalls aufgeführten Methoden tiefer eingeht.

Die einzelnen Methoden werden in Hinsicht auf die Bedienbarkeit, die Funktionalität und die Performance miteinander verglichen. So wird der Import mancher Produkttypen nicht von allen Methoden unterstützt, auch ist es in vielen Fällen von Vorteil, wenn die importierten Produkte automatisch indiziert werden und nicht nach jedem Teilimport alle Indizes für alle im Shop enthaltenen Produkte laufen müssen.

Grundsätzlich gibt es verschiedene Ansätze für Importe:

  • Extern gesteuert: die Produktdaten, die üblicherweise aus einem externen System kommen, werden dort oder in einer Middleware so aufbereitet, wie Magento sie erwartet. Anschließend werden sie mit einer der unten aufgeführten Methoden importiert, entweder als CSV-Datei oder über einen Webservice.
  • Magento-gesteuert: der Import wird über ein Magento-Modul gesteuert. Dieses ist dafür verantwortlich, die Daten von der Quelle abzuholen, in das passende Format umzuwandeln (häufig ein PHP-Array) und dann der entsprechenden Import-Methode zum Import zu übergeben. Dieses Modul kann entweder ein projektspezifisches eigenes Modul sein oder z.B. das von Paul Hachmang entwickelte Ho_Import.

Die Wahl des Ansatzes und des Importmoduls ist neben der Präferenz des verantwortlichen Entwicklers v.a. von den Projektbegebenheiten abhängig. Ein mit dieser Thematik erfahrener Entwickler / Berater kann bei der Wahl sowie bei der Implementierung üblicherweise unterstützen und einen ungeeigneten Ansatz von vornherein ausschließen.

Importmethoden

Mage::getModel

Produkte und andere Datentypen lassen sich innerhalb des Magento-Frameworks als Models mit dem Befehl Mage::getModel(…) ansprechen. Darüber können sie geladen, geändert, gespeichert und gelöscht werden. Diese internen Methoden bieten die volle Flexibilität über alle Funktionalitäten in Magento, nicht nur den Produktimport. Sie können in einem eigenen Modul bzw. Skript verwendet werden und bieten einen zuverlässigen Import mit allen Funktionalitäten. Der große Nachteil dieser Methode ist, dass sie relativ langsam ist, v.a. für Produktdaten, die in Magento recht komplex sind.

Soap / XmlRpc

Hierbei handelt es sich um die in Magento integrierten API-Methoden, womit man z.B. Produkte von einem anderen Server aus anlegen kann. Dies ist nicht beschränkt auf Importe, sondern umfasst auch das Anlegen und Auslesen von Kategorien, Kunden, Bestellungen, Rechnungen etc., also die wichtigsten, wenn auch nicht alle, Magento-Funktionalitäten. Alle verfügbaren Funktionen sind unter http://www.magentocommerce.com/api/soap/introduction.html aufgeführt. Der größte Nachteil ist auch hier die eingeschränkte Performance.

REST

REST ist die mit der Magento-Version 1.7 (Community Edition) eingeführte Webservice-Schnittstelle. Die Autorisierung erfolgt über OAuth, anschließend ist der Zugriff per REST möglich. Produkt- und Kundendaten können auch angelegt und bearbeitet werden, ansonsten ist nur lesender Zugriff, z.B. auf Bestelldaten, möglich. Details finden sich unter http://www.magentocommerce.com/api/rest/introduction.html. Die Hauptprobleme sind hier die eingeschränkte Funktionalität und die ebenfalls eingeschränkte Performance.

Dataflow

Dataflow ist die „alte“ Methode, Produkt- und Kundendaten in Magento zu importieren und zu exportieren. Sie arbeitet mit CSV-Dateien in einem bestimmten Format. Es ist allerdings nicht einfach, diese Methode in einen eigenen Workflow einzubinden und krankt an der sehr schlechten Performance. Diese Methode ist als veraltet anzusehen, wird aber immer noch vereinzelt verwendet.

ImportExport

ImportExport ist ein seit der Version 1.5 in Magento integriertes Modul, das die Nachfolge von Dataflow angetreten hat und Kunden- sowie Produktdaten deutlich schneller importiert und exportiert. Auch ImportExport basiert auf dem Einlesen von CSV-Dateien in einem speziellen (anderen) Format, für das unter http://www.webguys.de/magento/turchen-19-produktimport-mit-der-importexport-schnittstelle/ eine Erläuterung zu finden ist. Gegenüber Dataflow ist ImportExport ein deutlicher Fortschritt, hat aber immer noch den Nachteil, dass es aufgrund der Festlegung auf CSV-Dateien schwierig ist, es in einen eigenen automatisierten Workflow einzubinden. Ein weiterer Nachteil ist, dass ImportExport keine Indizierung unterstützt, sprich nach einem Import müssen immer alle Indizes neu aufgebaut werden.

FastSimpleImport

Dieses vom Autor dieses Artikels initiierte Modul basiert auf ImportExport und ist als kostenloses OpenSource-Modul unter https://github.com/avstudnitz/AvS_FastSimpleImport verfügbar. Es ermöglicht, die Daten in Form eines PHP-Arrays bereit zu stellen und damit in eigene Workflows zu integrieren. Gegenüber ImportExport rüstet es auch einige weitere Funktionen wie Kategorieimport oder partielle Indizierung nach. Nachteil dieses Moduls ist wie bei ImportExport das komplizierte, nicht besonders intuitive Datenformat, wobei kleinere Optimierungen gegenüber dem Standardmodul vorgenommen wurden.

ApiImport

ApiImport verfolgt ein ähnliches Konzept wie FastSimpleImport und basiert ebenfalls auf ImportExport. Es wurde von dem niederländischen Entwickler Daniël Sloof entwickelt und unter https://github.com/danslo/ApiImport kostenfrei bereit gestellt. Es bietet die meisten Funktionen von FastSimpleImport sowie einen möglichen Zugriff per SOAP oder XmlRpc und beschleunigt den Import über Webservices damit deutlich.

CustomImportExport

Das kostenlose Magento-Modul von Antonio Martinez (verfügbar unter http://www.magentocommerce.com/magento-connect/amartinez-customimportexport.html) verfolgt den gleichen Ansatz wie FastSimpleImport und ApiImport, indem es den Magento-Standard-Import „ImportExport“ verwendet und erweitert. Es hat ein ausgereiftes Kommandozeilen-Interface, erwartet allerdings ausschließlich CSV-Dateien zum Import. Anscheinend wird das Modul nicht mehr aktiv weiterentwickelt, das letzte Release ist von Anfang 2012.

Magmi

Magmi ist ein kostenloses Import-Tool des französischen Entwicklers Sébastien Bracquemont, verfügbar unter http://sourceforge.net/projects/magmi/. Es handelt sich um ein von Magento unabhängiges PHP-Tool mit eigener Oberfläche, das direkt auf die Magento-Datenbank zum Import zugreift. Über ein Plugin-System sind Erweiterungen verfügbar. Es importiert im Standard aus CSV-Dateien im Dataflow-Format, ermöglicht aber einen deutlich schnelleren Import und erweiterte Funktionen. Über die so genannte Datapump-Funktionalität lassen sich auch Produkte über PHP-Skripte importieren. Über vollständige Indizierungsfunktionalitäten verfügt das Modul leider nicht, sodass manche Indizes nach jedem Import separat angestoßen werden müssen.

uRapidFlow® und uRapidFlow® Pro

uRapidFlow ist das einzige kommerzielle Modul in der Liste. Es wurde entwickelt von Boris Gurvich, einem der führenden Köpfe hinter Magento, der sich 2008 mit seiner Firma Unirgy selbstständig gemacht hat. Die einfache Version des Importers ist unter http://www.unirgy.com/products/urapidflow/ ab 120 $ verfügbar, die Pro-Version gibt es für 670 $ – mit dieser lassen sich Kategorien und zusätzliche Produkttypen importieren. uRapidFlow ist ein sehr flexibles Magento-Modul, das verschiedene Importe anhand von Profilen ermöglicht. Hauptnachteil des Moduls ist, dass Teile des Quellcodes mit dem PHP-Modul ionCube verschlüsselt sind.

Featurevergleich

Die zentralen Features der einzelnen Importmethoden gibt die folgende Tabelle wieder:

In Magento integriert Partielle Indizierung Webservice Einfache Produkte Konfig. Produkte Gruppierte Produkte Bündel- Produkte Download- Produkte Kategorien Kunden
Mage::getModel X X X X X X X X X
Soap / XmlRpc X X X 1 X 1 X X
REST X X X X
DataFlow X 2 2 X
ImportExport X X X X X
FastSimpleImport X X X X X X X
ApiImport X X X X X X X X
CustomImportExport X X X X
Magmi X3 X X X X
Urapidflow X X
Urapidflow Pro X X X X X X

1 Freies Modul verfügbar

2 Kommerzielles Modul verfügbar

3 Nur URL-Rewrite-Index und Kategorie-Produkt-Index über ein freies Plugin

Performancevergleich

Die Performance der einzelnen Methoden haben wir über ein für diesen Zweck geschriebenes kleines Import-Framework gemessen, das unter https://bitbucket.org/integer_net/integernet_importtest frei verfügbar ist und über den Magento-Composer-Installer die notwendigen Importmodule nachlädt. Es ist über Kommandozeilenbefehle steuerbar und gibt die gemessenen Importzeiten entsprechend wieder:

Magento-Composer-Installer

Shell-Aufruf Import-Test

  • Vor jedem Import werden alle Produkte erneut gelöscht, um eine saubere Datenbank zur Verfügung zu haben.
  • Wir haben die verschiedenen Importmethoden einmal ohne und einmal mit partieller Indizierung gemessen, für bis zu 50.000 einfache Produkte mit den notwendigen Pflicht-Attributen.
  • Als URL-Index haben wir das kostenlose OpenSource-Modul EcomDev_UrlRewrite im Einsatz, das eine deutlich bessere Performance als der Standardindex bietet und zumindest von ApiImport und FastSimpleImport auch direkt unterstützt wird.

Ergebnisse ohne Indizierung (in Sekunden)

Anzahl Produkte 5 50 500 5.000 50.000
Mage::getModel 1,21 9,46 89,37 867,09
Soap / XmlRpc 37,16 317,37 3147,2
REST 8,11 83,99 862,89
DataFlow 2,4 12,84 124,43 1228,7
ImportExport 0,75 0,94 3,84 34,9 369,87
FastSimpleImport 0,66 1,02 4,46 37,36 370,55
ApiImport 1,2 0,69 5 39,72 655,83
ApiImport (via XmlRpc) 2,53 2,78 5,38 223,83
CostomImportExport 7,59 7,45 11,59 50,62 429,87
Magmi 0,26 2,06 24,3 194,96 1960,8
uRapidFlow1 0,15 0,36 2,66 24,77 240,46

1 Schätzung, da direkter Test nicht möglich

Ergebnisse mit partieller Indizierung (in Sekunden)

Anzahl Produkte 5 50 500 5.000 50.000
Mage::getModel 5,22 51,11 631,48 20523
Soap / XmlRpc
REST
DataFlow
ImportExport
FastSimpleImport 1,58 1,88 5,69 44,38 434,27
ApiImport 1,2 0,69 5 39,72 655,83
ApiImport (via XmlRpc) 2,53 2,78 5,38 223,83
CostomImportExport
Magmi1 0,24 2,36 23,88 239,55 3486,7
uRapidFlow2

1 Nicht alle Indizes werden unterstützt

2 Nicht getestet, aber unterstützt

Ergebnisdiagramm

Ergebnisdiagramm

Ergebnisdiagramm

Man sieht sehr deutlich, dass es große Geschwindigkeitsunterschiede zwischen den folgenden Gruppen gibt:

  • Methoden, die auf Mage_ImportExport basieren (ImportExport selbst, FastSimpleImport, ApiImport) inklusive uRapidFlow, das noch etwas schneller ist
  • Sonstige externe Methoden (Magmi)
  • Sonstige in Magento integrierte Methoden – v.a. der Import über SOAP ist extrem langsam und benötigte in unseren Testfällen 5 Sekunden pro Produkt – ohne Indizierung, die noch anschließend erfolgen muss.

Die ermittelten Ergebnisse sind natürlich nur für genau den verwendeten Server in einer speziellen Konfiguration verfügbar. Dennoch zeigen sie natürlich Aufschluss über die relative Performance der einzelnen Methoden untereinander.

Fazit und persönliche Empfehlung

Persönlich setze ich für fast alle Fälle das von mir initiierte Modul FastSimpleImport ein, da es in den Punkten Performance und Zusatzfunktionen im Moment die Nase vorn hat (und natürlich auch, da ich es am besten kenne). ApiImport und Magmi sind daneben fast gleichwertige Lösungen, die ebenfalls bedenkenlos eingesetzt werden können, auch wenn mir persönlich der Ansatz von Magmi als externes Tool mit Direktzugriff auf die Datenbank nicht zusagt. Interessant ist auch “uRapidFlow”, das mit der höchsten Geschwindigkeit aufwartet. Dafür muss man allerdings bezahlen (und erhält dafür hervorragenden Support) und muss den Nachteil der Verschlüsselung in Kauf nehmen.

Stärker als die absolute Performance, die von vielen Faktoren und auch Einstellungen des Moduls abhängt, sollte bei der Entscheidung für eine Importmethode meiner Meinung nach die Funktionsvielfalt und die Bedienbarkeit gewichtet werden. So kann es in manchen Fällen durchaus sinnvoll sein, auch für den Produktimport Mage::getModel zu verwenden, trotz der geringen Performance. Für viele andere Anwendungsfälle wie den Import von Attributen, Attributsets, Kundengruppen, Preisregeln etc. ist dies sowieso notwendig.

Soll ein Zugriff über die Magento-API erfolgen, würde ich üblicherweise ApiImport einsetzen, das den Produkt-, Kategorie- und Kundenimport über SOAP oder XML-RPC gegenüber dem Magento-Standard deutlich beschleunigt.Importe sind in den allermeisten Fällen projektspezifisch und bieten auch unabhängig vom jeweiligen Importmodul vielfältige Optimierungsmöglichkeiten. Die reine Importzeit ist in vielen Fällen nur ein kleiner Teil der insgesamt benötigten Laufzeit, wenn noch Produktbilder heruntergeladen oder Daten angereichert oder nachbearbeitet werden müssen. Daher kann dieser Artikel nur einen Überblick über die Importmethoden bieten und keine Beratung durch einen Experten bzw. eigene Erfahrung ersetzen.

Über Kommentare, Fragen und Ergänzungen würden wir uns sehr freuen.

Andreas von Studnitz

Autor: Andreas von Studnitz

Andreas von Studnitz ist Diplom-Informatiker, Magento-Entwickler und Geschäftsführer von integer_net. Seine Schwerpunkte sind Schnittstellenentwicklung, Backendentwicklung, Beratung und Entwicklerschulungen. Seit 2011 ist er Magento Certified Developer, seit 2014 Magento Certified Solution Specialist.

Mehr Informationen

Dieser Beitrag hat 1 Kommentar

Einen Kommentar hinterlassen