André: Problem mit xml_parse_into_struct

Hallo zusammen,

ich möchte in einem Script XML-Dateien parsen.
Hierzu lade ich die Datei in eine Variable und lasse diese dann per Problem mit xml_parse_into_struct() in zwei Arrays parsen.

Auf meinem lokalen PC funzt das auch super.

Aber auf dem Server, bei dem es laufen soll, bricht der Parser ab einer bestimmten Dateigröße ab (zwischen 400 und 700KB).
Die Dateien sind übrigens .GPX Dateien, enthalten also eine recht einfache XML-Struktur (GPS-Austauschformat).

Hier mal das Script:

$gpxdatei = fopen ('dateiname.gpx', 'r') or die('Konnte GPX-Datei nicht öffnen');
while (!feof($gpxdatei)) {
  $buffer .= fgets($gpxdatei, 4096);
}
fclose ($gpxdatei);
$p = xml_parser_create();
xml_parser_set_option($p,XML_OPTION_SKIP_WHITE,1);

echo "parse XML-Datei:\n";
xml_parse_into_struct($p, $buffer, $vals, $index);

echo "Werte: ".count($vals).", Index: ".count($index);

Das komische ist, dass ich keine Fehlermeldung erhalte. Wenn die Datei zu groß ist (> ca. 400 KB), dann bricht das Script wortlos ab. Das heisst, das echo vor dem xml_parse_into_strukt wird noch ausgegeben und dann ist Schluß.

Am Script-Timeout kann es auch nicht liegen, denn der Abbruch erfolgt bereits nach ca. 2 - 5 Sekunden (Timeout 120 s).

Kennt jemand dieses Prolem? Und gibts vielleicht eine andere Lösung, um die XML-Daten zu parsen?

Gruß, André

  1. Hallo André,

    nur ein kleiner Verdacht: Kann es eventuell sein, dass der Apache abschmiert? Falls Du Zugriff auf die log-Dateien auf dem Server hast, kannst Du das recht leicht feststellen.

    Gruß Andree

  2. Liebe(r) André,

    meines Wissens kannst Du den Parser in Abschnitten über deine Daten laufen lassen, sodass Du Deine XML-Datei in Häppchen parsen lässt.

    In meinem Code sieht das in etwa so aus:

    while ($data = fread($fp, 4096))  
       {  
       $parse = xml_parse($this->xml, $data, feof($fp));  
       ...  
       }
    

    Ich hatte zu diesem Problem eine Klasse aus den Userkommentaren auf der XML-Seite der PHP-Doku von Raphael Schmid (ein sehr netter Mensch, hat prompt auf meine mail geantwortet!) ausprobiert. Schau dort mal nach!

    Raphael hat mir per Mail dann gleich seine komplette XML-Parser-Klasse geschickt. Wenn Dir das Code-Beispiel dort (mit allen Verbesserungen) nicht genügt, dann maile ihm doch auch mal!

    Liebe Grüße aus Ellwangen,

    Felix Riesterer.

  3. echo $begrüßung;

    Auf meinem lokalen PC funzt das auch super.
    Aber auf dem Server, bei dem es laufen soll, bricht der Parser ab einer bestimmten Dateigröße ab

    Liegt es an unterschiedlichen memory_limit-Einstellungen? Siehe phpinfo()-Ausgabe. Wenn du den Fehler auf dem lokalen PC mit der gleichen memory_limit-Einstellung nachvollziehen kannst, dann wende dich an deinen Provider. (Allerdings wird er die Speicherbegrenzung nicht ohne Grund eingeschaltet haben und die Chancen, dass er sie ändert, schätze ich als gering ein.)

    echo "$verabschiedung $name";