Importeren via Magento

Regelmatig krijgen wij van klanten het bericht dat zij problemen hebben met producten importeren in Magento. Nou hebben we gelukkig wel enkele tips en truuks, maar soms moeten we dan even schaapachtig mee lachen, met een “Ja, de Magento import is niet super snel, nee…”, maar een echte oplossing hiervoor is niet makkelijk te vinden. En het vervelende is, zelfs het vinden van de oorzaak is redelijk moeilijk. Gelukkig hebben we over de afgelopen jaren een groot aantal tools bij elkaar gepakt waarmee we hopelijk wel wat verder kunnen komen.

This post is also available in English: Speeding up Magento imports.

Importeren in Magento voor Dummies

De standaard Magento import is bij de meeste gebruikers wel bekend. Men draait een export, download de CSV en vult deze vervolgens met een export van de eigen gegevens. An sich geen rocket science. Het probleem begint daarna echter pas echt. Deze .CSV file moet vervolgens worden geüpload naar de server en door Magento worden geïmporteerd. Meten is Weten, en dus heb ik even snel een test shop (Versie 1.4.0.1) gepakt, en een export/import gestart. Er zat wat voorbeeld data in en dus had ik na een paar seconden een mooie .CSV file met 120 producten erin. Het importeren in Magento duurde echter behoorlijk wat langer. Een minuut of 5 later waren alle gegevens geïmporteerd en waren de benodigde indexes refreshed. 120 producten / 5 minuten is 0.4 producten / seconden, of 2.5 seconden per product. Natuurlijk meteen de instellingen gecontroleerd, maar alle caching stond gewoon netjes aan. Als test een tweede import gedaan maar daar zat helaas geen snelheids-verbetering in.

De oorzaak zoeken

Het eerste waar we naar kijken in zo’n geval is “Wat is Magento nou weer aan het doen…”. Helaas had ik geen PHP debugger bij de hand, maar we hebben natuurlijk wel strace. Een super snelle tool die exact laat zien welke system calls een programma allemaal doet. Wat zoeken en scripten later draait er een nieuwe import, nu met strace aan op de server, en het eerste wat opvalt, is dat er erg veel verkeer met de database plaats vindt. Op zich logisch, zou je denken, want we zijn gegevens aan het importeren. Echter toen ik er een tellertje bij hing, bleek dat Magento voor elke te importeren regel tot wel 450 database queries doet. Nou is het een tijdje geleden dat ik met MySQL en PHP applicaties ontwierp, maar ik kan me niet herinneren dat je voor het importeren van zo’n product 450 queries nodig hebt voor één enkele import.
Deze queries zijn uiteraard ook gesaved door strace en een simpele handmatige scan later begint het een en ander duidelijk te worden. Magento maakt gebruik van het EAV Model voor hun databases. Op zich een prima model voor producten met veel potentiële attributen, maar helaas een crime om dat in een SQL database op te slaan. En dat merken we hier bijvoorbeeld bij het importeren. Elke kolom in de .CSV file die we importeren, bestaat uit een 100-tal kolommen, en dat zijn allemaal losse queries. Ook draait Magento de herindexeer queries na elk product. Zo kom je dus wel aan een totaal van 450 queries.

Importeren in Magento voor Gevorderden

Gelukkig komen er steeds meer oplossingen om toch snel te kunnen importeren in Magento. De markt rondom Magento begint steeds duidelijker door te krijgen dat Magento helaas erg wordt tegengehouden door hun zeer uitgebreide datamodel en zware php API hieromheen. Magento moet hier natuurlijk wel het “goede voorbeeld” geven en de gehele API doorlopen bij alles wat ze doen.
In de markt ligt dat gelukkig anders. Hier heeft men gewoon de optie om voor “snelheid” te kiezen waar dat nodig is, en bij Magento imports lijkt dat steeds vaker het geval te zijn. Zo kregen wij de afgelopen weken een goede tip door van een partner van ons.

Introducing Magmi (MAGento Mass Importer)

Magmi

Riksjasoft had al enige tijd problemen met het importeren van producten. De snelheid was daar zo laag dat zij bij sommige sites de hele nacht een server vol trokken en meer dan 7 uur bezig waren om een duizendtal producten te importeren. We hebben samen wat zitten debuggen, maar uiteindelijk hebben we het niet op kunnen lossen.

Gelukkig kwamen zij toen zelf met een andere oplossing: Magmi. Deze MAGento Mass Importer maakt expres niet gebruik van de Magento PHP API maar communiceert direct met de SQL database van Magento. Hierdoor kunnen zij een enorme snelheids winst behalen in vergelijking met de standaard Magento Importer die de PHP API gebruikt. Verder maken ze gebruik van nog wat slimme truucjes; Zo kijken ze bijvoorbeeld eerst wat er aangepast is en updaten alleen dat, in plaats van gewoon alles te overwriten. Omdat er bij de meeste periodieke imports niet veel verandert, zal dit, zeker in de praktijk, een enorme snelheidswinst betekenen.

Uiteraard heb ik dit ook even snel geïnstalleerd en getest, en de resultaten mogen er zijn. Dezelfde import van 120 producten kost nu nog maar 5 seconden, in plaats van 5 minuten. En ook Wim van Riksjasoft heeft vergelijkbare resultaten te melden:

Werden er via de oude Magento import via de cronjob gemiddeld 5 à 6 producten per minuut ingelezen, via Magmi is dit ongeveer 400 producten per minuut.
Daarnaast is de database load veel en veel lager, waardoor het aantal BPU’s veel lager uitvalt dan eerst.

Op een lokale omgeving hebben we ook een testimport gedaan van 22.000 producten. De import zelf duurde 4,5 minuut (5000 producten per minuut !!), de herindexering daarna, 6,5 minuten, dus een totaaltijd van 11 minuten voor 22000 producten…

Wat is het verschil tussen Magmi en deze import methode? Bij de Magmi import worden eerst alle producten ingelezen en aan het einde vindt een soort indexering plaats. Doordat die indexering tijdens de normale import procedure van Magento plaatsvindt, is deze methode zo traag.

Dat klinkt bijna te mooi om waar te zijn, zou je zeggen. Natuurlijk zitten er nog enkele downsides aan dit script. Zo geven de ontwikkelaars zelf nog aan dat dit Beta software is, en dat je deze eigenlijk nog niet in productie moet draaien. Ook ondersteunen ze nog niet alle product types; Alleen de simple products werken nu betrouwbaar, maar aan de rest wordt nog ontwikkeld. Voor een groot deel van de shops is dit echter geen probleem, en hier zou Magmi, na een goede uitgebreide test, best in de productie omgeving kunnen draaien.

Implementeren?

Magmi is dus zeker een aanrader om eens mee te testen. Echter, het blijft beta software. We hebben het hier in een test omgeving twee maal geprobeerd, dus wij weten er ook niet alles van. Byte kan dan ook geen support leveren op Magmi, mocht er iets niet helemaal lekker gaan bij een import. Denk dus voordat je het gaat gebruiken even aan de volgende dingen:

  1. Test altijd eerst op een aparte testomgeving;
  2. Test na je Magento import in je testomgeving of ALLES het nog doet. Van browsen tot bestellen, van recenseren tot retourneren, alles wat maar een beetje met producten te maken heeft;
  3. Schrijf voor jezelf uit wat je allemaal test na een import. Dan kan je makkelijk een checklist maken en ervoor zorgen dat je niets vergeet;
  4. Zorg voordat je live gaat met het import script dat je een recente backup van zowel de shop als de database heb. Byte verzorgt deze standaard voor klanten, maar maak zelf een recente kopie. Zaterdagnacht om 04:00 een backup terugvragen kan namelijk wel eens eventjes duren;
  5. Nogmaals, na het live gaan, testen testen testen en je logfiles in de gaten houden op foutmeldingen.

Partners en imports

Omdat importeren voor Magento zo’n hot issue is, zijn ook partners van Byte aan het ontwikkelen geslagen. Zo heeft Made by Mouses voor hun klanten een imports module gemaakt en heeft Jos Spyker een zeer geavanceerde module klaar gestoomd voor productie. Details zijn nog niet bekend maar we gaan deze post zeker aanvullen met onze nieuwe bevindingen zodra we met deze producten een testrun hebben kunnen doen.

Ervaring met Magmi? Wij horen het graag, dus laat zeker even een commentaar achter op het blog. Ook als je andere software heb gebruikt, of nog goede tips heb om het importeren/exporteren te versnellen, we horen het graag!

Scan je eigen Magento shop op veiligheidslekken