Lokale und entfernte Datei lesen
Gast
- php
Hi,
wenn ich eine lokale Datei so öffne:
$datei = file( "beispiel.htm" );
dann erhalte ich ein array, in dem jedes Element mit "\n" endet.
Öffne ich eine entfernte Datei aber so:
$handle = fopen ( "http://example.com/beispiel.htm", "r");
if ($handle)
{
while (!feof ($handle))
{
$datei .= fgets ($handle, 1024);
}
$datei = explode( "\n", $datei );
}
fehlt jedem Element das "\n". Da ich anschliessend dieselbe Routine zur Weiterverarbeitung brauche, ist ein einheitliches array wichtig.
Wie könnte explode() (oder ein anderes Kommando) ohne Datenverlust arbeiten?
Gruß, Frank
Hi,
wenn ich eine lokale Datei so öffne:
$datei = file( "beispiel.htm" );
> dann erhalte ich ein array, in dem jedes Element mit "\n" endet.
Und wenn du im Manual nachliest, dann merkst du, dass file zusätzliche Parameter nehmen kann.
MfG ChrisB
--
RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
Hi Chris,
Und wenn du im Manual nachliest, dann merkst du, dass file zusätzliche Parameter nehmen kann.
Danke für den Hinweis, ist aber nur die zweitbeste Lösung, weil ich dann die folgende Verarbeitung ändern muss.
Das Öffnen der externen Datei ist neu, aber ich sehe, man könnte das ja auch mit file machen. Aber wie merke ich dann, wenn die externe Datei nicht vorhanden ist?
Wenn $datei leer ist - oder wie?
Gruß, Frank
Wer auch das Kleingedruckte liest, ist klar im Vorteil:
"Im Fehlerfall gibt file() FALSE zurück."
Hello,
Wer auch das Kleingedruckte liest, ist klar im Vorteil:
"Im Fehlerfall gibt file() FALSE zurück."
Dann weißt Du aber immer noch nicht, woran es gelegen hat. Dazu musst Du bei PHP leider den Fehlertext auswerten.
Dazu musst Du z.B. mit ini_set('track_errors', 1) die Fehlertextregistrierung einschalten.
http://www.php.net/manual/de/errorfunc.configuration.php#ini.track-errors
Danach kannst Du dann in der Variable $php_errormsg
http://www.php.net/manual/de/reserved.variables.phperrormsg.php
den Fehlertext mittels strpos() auf das Vorhandensein typischer Textteile untersuchen und daraus die Ursache ableiten.
Es könnte auch sein, dass die Ressource gerade gesperrt ist für das lesen. Dann lohnt es sich ggf. ein paar Millisekunden später nochmals nachzufragen...
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hi!
Es könnte auch sein, dass die Ressource gerade gesperrt ist für das lesen. Dann lohnt es sich ggf. ein paar Millisekunden später nochmals nachzufragen...
Gesperrt? Welcher HTTP-Status-Code ist das? Ist dir sowas schonmal in freier Wildbahn beim Browsen begegnet?
Lo!
Hello,
Es könnte auch sein, dass die Ressource gerade gesperrt ist für das lesen. Dann lohnt es sich ggf. ein paar Millisekunden später nochmals nachzufragen...
Gesperrt? Welcher HTTP-Status-Code ist das? Ist dir sowas schonmal in freier Wildbahn beim Browsen begegnet?
Man bekommt dann nur eine Timeout für den Stream. Fsockopen funktioniert aber.
Ich hatte das auch schon mal ausprobiert. Muss mal suchen, wie die Fehlermeldung dann lautet.
Wie sich das dann auf file() auswirkt, was ja beide Funktionalitäten vereint, habe ich aber nicht ausprobiert.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hello,
Hello,
Es könnte auch sein, dass die Ressource gerade gesperrt ist für das lesen. Dann lohnt es sich ggf. ein paar Millisekunden später nochmals nachzufragen...
Gesperrt? Welcher HTTP-Status-Code ist das? Ist dir sowas schonmal in freier Wildbahn beim Browsen begegnet?
Man bekommt dann nur eine Timeout für den Stream. Fsockopen funktioniert aber.
Ich hatte das auch schon mal ausprobiert. Muss mal suchen, wie die Fehlermeldung dann lautet.Wie sich das dann auf file() auswirkt, was ja beide Funktionalitäten vereint, habe ich aber nicht ausprobiert.
Ich habe das jetzt nochmal ausprobiert.
üblicherweise fürde man bei Verwendung von fopen() vorher ein Read-Timeout einstellen, dass kleiner ist, als die Maximlae Ausführungszeit des Scriptes.
http://www.php.net/manual/en/function.stream-set-timeout.php
Das muss man bei file() über den Parameter Ressource-Kontext tun.
Da muss man sich dann gewaltig durchhangeln, um alles richtig einzustellen.
Man landet letztendlich bei
http://www.php.net/manual/en/context.http.php
also:
http://www.php.net/manual/en/function.stream-context-create.php
http://www.php.net/manual/en/function.stream-context-set-option.php
http://www.php.net/manual/en/context.http.php
Viel Spaß dabei :-O
Das Array sollte man sich irgendwo mit seinen Wunschwerten gefüllt beiseite legen ;-)
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hello,
Das Öffnen der externen Datei ist neu, aber ich sehe, man könnte das ja auch mit file machen. Aber wie merke ich dann, wenn die externe Datei nicht vorhanden ist?
Wenn $datei leer ist - oder wie?
Welche Fehlermeldung bekommst Du denn, wenn Du einen Request auf eine nicht vorhandene Ressource durchführst?
Warning: file(http://bitworks.de/not_existing_file.txt) [function.file]: failed to open
stream: HTTP request failed! HTTP/1.1 404 Not Found in
M:\USER\TOM\WebProgTests\Xampp\dateizugriffe\download\get_url.php on line 3
und ein var_dump($_data) ergibt dann
bool(false)
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hello Frank,
für die Lösung deines Problemes möchte ich Dir die Streamfunktionen ans Herz legen.
Benutze nicht die namensbasierten Funktionen (file(), file_get_contents(), usw.).
Die sind für eine vernünftige Flusskontrolle und echten konkurrierenden Betrieb meistens ungeeignet.
http://php.net/manual/en/function.stream-get-line.php in einer Schleife müsste das leisten, was Du erreichen willst und du hast dann volle Kontrolle über die Fehler-/Metadaten und kannst das Timeout auch passend einstellen, damit die Scriptlaufzeit (Max-Execution-Time) auf jedenfall länger ist.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg