simplexml_load_file Fehlermeldungen

Torsten Ernst

Mitglied
Hallo,

nachdem ich eine Woche ohne Erfolg versucht habe mein Problem selbst zu lösen hoffe ich nun hier Hilfe zu finden. Ich habe ein kleines Projekt einschließlich Internetpräsenz ehrenamtlich übernommen. Leider wird ab und zu ein Block von Fehlermeldungen angezeigt wie z.B.

PHP:
Warning: simplexml_load_file() [function.simplexml-load-file]: data.xml:25: parser error : Char 0x0 out of allowed range in /www/htdocs/w00f689b/table.php on line 56

Warning: simplexml_load_file() [function.simplexml-load-file]: in /www/htdocs/w00f689b/table.php on line 56

Warning: simplexml_load_file() [function.simplexml-load-file]: ^ in /www/htdocs/w00f689b/table.php on line 56

Warning: simplexml_load_file() [function.simplexml-load-file]: data.xml:25: parser error : Premature end of data in tag receptionReports line 2 in /www/htdocs/w00f689b/table.php on line 56

Warning: simplexml_load_file() [function.simplexml-load-file]: in /www/htdocs/w00f689b/table.php on line 56

Warning: simplexml_load_file() [function.simplexml-load-file]: ^ in /www/htdocs/w00f689b/table.php on line 56

Diese kommen nur ab und zu, ohne das ich da ein Grund erkennen kann. Lass ich die Seite im Browser anschließend aktualisieren, wird die Seite korrekt angezeigt. Hier ist der Anfangscode der Datei:

PHP:
<?php

include("log.php");

$host = "retrieve.keine Werbung.info";
$documentpath = "/query?senderCallsign=";

//-------- Cookie auswerten und setzen -----
$callsign=strtoupper(substr($HTTP_GET_VARS["call"], 0, 10));
if ($callsign=="")
{
if (!$_COOKIE["Callsign"])
{
$callsign="XXXX";
}
else
{
$callsign=$_COOKIE["Callsign"];
}
}
setcookie("Callsign",$callsign, time()+2592000);
$documentpath=$documentpath.$callsign;

//-------- Begin data.xml -----
//-------- XML-Datei einlesen -----
$fp = @fsockopen($host, 80, $errno, $errstr, 10);

if ($fp)
{
$request = "GET {$documentpath} HTTP/1.0\r\n";
$request .= "Host: {$host}\r\n";
$request .= "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.8) Gecko/20050511  Firefox/1.0.4\r\n\r\n";
$request .= "Content-type: text/html\r\n";

fputs ($fp, $request);
$xmldat = fopen("data.xml", "w");

while (!feof($fp))
{
$content = fgets($fp, 1024);
if ($n>=8)
{
fwrite($xmldat, $content);
}
$n++;
}
fclose($xmldat);
fclose($fp);
$xmlreceived=true;
}
else
{
$xmlreceived=false;
}

$xml = simplexml_load_file('data.xml');
.....

Ich bin leider in Sachen PHP noch ein Anfänger, aber so sehr ich mich auch bemühe, ich kann hier keinen Fehler erkennen. Kann es sein, dass die Daten nicht schnell genug in die data.xml geschrieben werden und es dadurch zu Problemen kommt? Das würde auch dieses Zufallsprinzip erklären.

Ich würde mich sehr über hilfreiche Hinweise freuen.

Liebe Grüße, Torsten
 
Hi und Willkommen bei tutorials.de,

Auf eine zentrale Datei schreibend zuzugreifen (data.xml) ist generell eine schlechte Idee.
Das fopen mit "w" geht nämlich schon mal nicht, wenn die Datei schon so offen ist.
Wenn da zwei oder mehr Leute gleichzeitig die Seite aufrufen krachts.

Da wäre eine DB angebracht...
 
Vielen Dank für die schnelle Antwort. Ich habe aus dem "w" ein "r" gemacht und auf die Schnelle mal getestet. Die Fehlermeldungen sind vorerst nicht erschienen, ich muss die Seite nun weiter beobachten. An eine DB habe ich auch schon gedacht. Da kann ich dann schön alles seitenweise aufteilen und kann viel mehr machen. Ich traue mich da nur noch nicht ran, werde mich aber mal schlau machen. Danke schon mal für den ersten Ratschlag. :)

Liebe Grüße, Torsten
 
Ich habe aus dem "w" ein "r" gemacht
So hab ich das aber nicht gemeint :D

Es stimmt zwar, dass bei "r" mehrere gleichzeitig öffnen können, aber:
Dafür kann die Datei auch nicht geändert werden.
Das fwrite ein paar Zeile drunter soll ja etwas in die Datei schreiben.


Das ist eben ein generelles "Problem" mit Dateien, Schreibzugriff geht nur einmal gleichzeitig.
Und die anderen warten nicht automatisch, sondern bekommen Fehler.
Mit mehr Programmieraufwand könnte man zwar so eine Art Warteschlange machen,
aber uA. dieser Mehrzugriff ist mit einer DB eben kein Problem mehr.
 
Du hast Recht, dass war Quatsch. Die Fehler waren zwar weg aber die Seite natürlich nicht mehr aktuell, da nichts mehr in die data.xml geschrieben wurde. Das Problem ist bei einer DB, ich muss komplett alles umschreiben und das wäre ein großer Aufwand. Zumal ich wie gesagt das Projekt übernommen habe und eigentlich nur am Leben erhalten möchte. Nur eben ohne Fehlermeldungen, denn das wurmt mich ungemein. Und ich weiß auch nicht ob ich das bei meinem Wissen überhaupt umgesetzt bekomme. Gibt es denn keine anderen (weniger aufwendigen) Alternativen als eine DB um die Fehler weg zu bekommen?

Liebe Grüße, Torsten
 
Sehr hässlich, aber:
Man könnte prüfen, ob die Datei mit "w" geöffnet werden konnte,
und wenn nicht, mit usleep etwas warten und dann wieder öffnen probieren.
Schleife.

Das wäre jedenfalls relativ wenig Programmieraufwand.

Nachteil a: Bei vielen Instanzen gleichzeitig müssen die,
die als Letztes drankommen, vergleichsweise lang warten.
Ergebnis: Verlangsamung vom Seitenaufbau

b: Bei sehr vielen gleichzeitig kann/wird es vorkommen, dass einzelne Instanzen "verhungern".
Also, dass sie nie die offene Datei bekommen, weil während ihrer Wartezeit schon wer Anderer
die gerade geschlossene Datei für sich beansprucht.
Ergebnis: Max_Execution_time greift und der pechhabende Benutzer
bekommt einen Timeoutfehler im Browser.

c: Einfach grausig
...aber schnell und einfach gemacht wäre es...
 
Vielen Dank für deine Antwort. Ich versuche das mal so als Übergangslösung umzusetzen. Ich denke, ich komme um eine Datenbankanbindung nicht herum. Du schreibst unter Punkt c das es schnell und einfach gemacht ist. Das macht mir etwas Mut, denn im Moment habe ich noch keinen Schimmer wie ich es anfangen soll. Bevor ich mich hier mit vielen Fragen blamiere werde ich mich im Netz mal umsehen ob ich irgendwas finde und versuchen es hinzubekommen.

Liebe Grüße, Torsten
 
Ca. sowas statt einem einfachen fopen:
PHP:
while(!($xmldat = fopen("data.xml", "w+"))
    usleep(100);
 
Ich habe eben die ganze Zeit schon probiert. Den Code den ich mir zusammen gebastelt habe sieht bislang so aus.

PHP:
$file = 'data.xml';
if (is_writable($file)) {
    $xmldat = fopen($file, "w");
    }
    else
    {
    usleep(2000000);
    }

Bei der Schleife bin ich erst einmal nicht weiter gekommen.
So richtig verstehe ich dein Code nicht, ich dachte es muss erst geprüft werden ob die Datei geöffnet ist?
 
Meine Schleife etwas anders:
PHP:
$xmldat = fopen("data.xml", "w+");
while($xmldat === false)
{
    usleep(100);
    $xmldat = fopen("data.xml", "w+");
}
Öffnen
Wenn die Datei nicht geöffnet werden konnte (Returnwert ist false):
Warten und wieder versuchen.

Zu deiner Variante: Bin mir nicht sicher, ob is_writable als Überprüfung ausreicht.
Außerdem hast du "nur" ein if statt while. Mit dem "Probieren, bis es geht" wird so nichts.
Und 2 volle Sekunden sind doch etwas lang.
 
Zurück