Rolf b: PHP, Ajax XML Produkte einzeln laden

Beitrag lesen

Bist Du sicher, dass Du hier auf dem richtigen Weg bist? Also, so rein prinzipiell... Für eine XML-Datei mit 1000 Produkten liest Du die Datei 1001 mal ein, das ist komplett ineffizient. Aber dazu nachher mehr.

Die Indexierung $loadxml->Product[$sauber["index"]] sollte eigentlich funktionieren. Wenn dein XML in etwa so aussieht:

<?xml version='1.0'?>
<Products>
  <Product>
    ...
  </Product>
  <Product>
    ...
  </Product>
  ...
</Products>

dann sollte $loadXml->Product ein Array mit diesen Produkten sein, das Indexe von 0 bis n-1 hat (mit n=Anzahl von Produkten). Es sollte auch wurscht sein, ob Du auf Product[0] oder Product["0"] zugreifst, d.h. es ist egal, ob $sauber["index"] einen String oder ein integer enthält. Es ist nur kritisch, wenn Leerstellen dazukommen. Product["2"] funktioniert, Product[" 2"] nicht.

Product ist allerdings kein Array, sondern ein Objekt. Ich vermute, es implementiert das ArrayAccess Interface um ein arrayoides Verhalten zu zeigen... Es wäre daher sicherer, auf $loadXml->Product[intval($sauber["index"])] zuzugreifen.

So, aber nun Tacheles - es ist ineffizient, was Du da tust. Allein die einzelnen Ajax-Aufrufe bremsen den Import aus, auch wenn gar nichts weiter passiert. Das Laden und Parsen von 50.000 Produkten aus einer Datei kostet nochmal ordentlich. Ich würde Dir empfehlen, dem SaveProduct-Aufruf einen STARTINDEX mitzugeben. Der merkt sich dann den aktuellen Zeitpunkt, lädt die XML-Datei und läuft los. Nach jedem Produkt misst er, wieviel Zeit vergangen ist. Wird es zu viel (das ist etwas, was von deinem Server und deinen persönlichen Vorlieben abhängt), beendet er die aktuelle Runde und gibt den nächsten Startindex an den Client zurück. Der zeigt an "nnn Sätze importiert" (wobei nnn praktischerweise mit dem Startindex identisch ist) und startet den nächsten Import.

Wenn Du bei 50.000 Produkten von 15 Minuten ausgehst, schaffst Du mehr als 50 Produkte pro Sekunde, d.h. wenn Du den Ajax-Call 20 Sekunden lang laufen lässt, hast Du in einem Rutsch 1000 Produkte drin.

Rolf