Test ob file existiert
Fritz
- php
Hallo,
vorab schon mal die Bitte um Entschuldigung. Das Thema wurde hier und anderswo x-mal bahandelt.
Aber meine spezielle Frage konnte ich nirgends klären:
Ich prüfe auf die Erreichbarkeit eines URL mit:
$link = "http://www.example.com";
if ($handle = @fopen ($link, "rb")) {
echo $link." existiert und ist erreichbar";
}
else {
echo $link." nicht gefunden";
}
Soweit kein Problem.
Nun möchte ich auf die Erreichbarkeit einer bestimmten Datei prüfen.
Also:
$link = "http://de.selfhtml.org/schmarrn/kaese/butter.html";
Ergebnis:
http://de.selfhtml.org/schmarrn/kaese/butter.html nicht gefunden
Wunderbar, nicht anders erwartet.
Aber jetzt:
$link = "http://de3.php.net/schmarrn/kaese/butter.html";
Ergebnis:
http://de3.php.net/schmarrn/kaese/butter.html existiert und ist erreichbar
Hm???? Wieso denn das?
Bei verschiedenen Domains krieg ich entweder das eine, oder das andere Verhalten.
Hat jemand eine Erklärung dafür? (bin mir eigentlich fast sicher, daß ja ;-) Falls dem so ist: würder dieser jemand das hier bitte posten.
Gruß Fritz
Lieber Fritz,
genaueres weiß ich jetzt auch nicht, aber ich vermute etwas. Es wäre ja möglich, dass der HTTP-Request Deines Scripts beim Zielserver zwar "ins Leere" lief, der Server Dir aber ein gültiges Dokument ausgeliefert hat, ohne eine HTTP-Fehlernummer mit zu liefern. Damit ist für PHP das Dokument die angeforderte Seite, dein $handle bekommt eine gültige Resource und Dein Script liefert die beklagte Meldung.
Mach Doch mal einen Check, mit welcher HTTP-Header-Meldung besagte Käse-Seite an einen Browser ausgegeben wird!
Liebe Grüße aus Ellwangen,
Felix Riesterer.
Hallo Felix,
genaueres weiß ich jetzt auch nicht, aber ich vermute etwas. Es wäre ja möglich, dass der HTTP-Request Deines Scripts beim Zielserver zwar "ins Leere" lief, der Server Dir aber ein gültiges Dokument ausgeliefert hat, ohne eine HTTP-Fehlernummer mit zu liefern. Damit ist für PHP das Dokument die angeforderte Seite, dein $handle bekommt eine gültige Resource und Dein Script liefert die beklagte Meldung.
Klar, das ist es: es wird eine Fehlerseite ausgegeben.
Und diese Fehlerseite schickt natürlich einen 200 ok mit.
Natürlich?
Da schließt sich die nächste Frage an:
Kann man Fehlerseiten so schreiben, daß ein 404 mitgegeben wird?
Gruß Fritz
Hallo,
Kann man Fehlerseiten so schreiben, daß ein 404 mitgegeben wird?
Hab zu schnell getippt/gefragt:
Natürlich kann man!
<?php
header("HTTP/1.0 404 Not Found");
?>
Gruß Fritz
Heißa, Fritz,
> <?php
> header("HTTP/1.0 404 Not Found");
> ?>
Besser:
<?php
header($_SERVER['SERVER_PROTOCOL'].' 404 Not Found');
?>
Sonst wechselst du die HTTP-Version. Ich weiß nicht genau, wie sich das dann auswirkt, aber ich kann es nicht leiden, wenn ich über telnet eine Seite per HTTP/1.0 anfordere und dann zum Beispiel HTTP/1.1 zurückbekomme. Also verwenden wir doch das, was angefordert wurde.
Caramba!
Grüße aus Biberach Riss,
Candid Dauth (ehemals Dogfish)
Liebe(r) Candid Dauth,
Caramba!
<klugscheiss face="grins">Du weißt schon, dass das eben ein Fluch war?</klugscheiss>
Liebe Grüße aus Ellwangen,
Felix Riesterer.
Heißa, Felix,
<klugscheiss face="grins">Du weißt schon, dass das eben ein Fluch war?</klugscheiss>
Selbstverständlich weiß ich das. Aber irgendwie hat das so gut da hingepasst, das klingt so gut – „Heißa, Caramba“ ;-)
Ansonsten:
$kill = array (
"whom" => "Felix",
"cause" => "wrote unvalid HTML code ;-)"
);
Caramba!
Grüße aus Biberach Riss,
Candid Dauth (ehemals Dogfish)
Lieber Biberacher,
„Heißa, Caramba“
Das erinnert mich an das Kinderlied "Heißa, Kathreinerle" ...
Liebe Grüße aus Ellwangen,
Felix Riesterer.
Hello,
du solltest Nur einen HEAD-Request senden oder einen OPTIONS-Request. Zweiterer wird aber nicht von jedem HTTP-Server beantwortet. Ein HEAD-Request gehört aber zum Standardumfang und wird mMn viel zu selten eingesetzt. Außerdem kannst Du dann das Timeout für das Öffnen der Ressource und das Timeout für den Erhalt von Inhalten einstellen und beachten. Zusätzlich könntest Du noch Rücksicht auf ein bestehendes Lock auf dem Zielserver nehmen, indem Du nicht auf die Freigabe der Ressource wartest, sondern die Fehlermeldung auswertest.
Die notwendigen Methoden hierfür sind alle im PHP-Manual beschrieben. Man muss zugegbenerweise etwas danach suchen.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hallo Tom,
danke für Deine Antwort
du solltest Nur einen HEAD-Request senden
Die notwendigen Methoden hierfür sind alle im PHP-Manual beschrieben. Man muss zugegbenerweise etwas danach suchen.
Meinst Du fsockopen() ?
Gruß Fritz
Hello,
du solltest Nur einen HEAD-Request senden
Die notwendigen Methoden hierfür sind alle im PHP-Manual beschrieben. Man muss zugegbenerweise etwas danach suchen.Meinst Du fsockopen() ?
Ja, damit kann man das selber implementieren.
Es gibt aber vielleicht auch fertige Klassen dafür.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hi,
Nun möchte ich auf die Erreichbarkeit einer bestimmten Datei prüfen.
Also:
$link = "http://de.selfhtml.org/schmarrn/kaese/butter.html";
Was jetzt? Eine Datei? Oder eine URL? http hat nichts mit Dateien zu tun.
http://de.selfhtml.org/schmarrn/kaese/butter.html nicht gefunden
Aber jetzt:
$link = "http://de3.php.net/schmarrn/kaese/butter.html";
Ergebnis:
http://de3.php.net/schmarrn/kaese/butter.html existiert und ist erreichbar
Hm???? Wieso denn das?
Der Server antwortet mit (im Wesentlichen)
302 Found
Location: http://de3.php.net/search.php?show=quickref&lang=de&pattern=schmarrn%2Fkaese%2Fbutter.html
Er leitet den Request also auf eine andere HTTP-Ressource weiter - ohne eine Fehlerseite oder einen Fehlerstatus zu senden.
Wird diese Ressource angefordert, geschieht das gleiche Spielchen nochmal, es kommt wieder
302 Found
Location: http://de3.php.net/manual-lookup.php?pattern=schmarrn%2Fkaese%2Fbutter.html&lang=de
Also eine weitere Weiterleitung auf eine andere URL.
Wird diese Ressource angefordert, kommt
200 OK
samt der Seite.
Es existiert also eine Ressource, die unter der genannten URL erreichbar ist (wenn auch auf Umwegen).
Auf de.selfhtml.org existiert eben keine derartige Umleitung, also kommt auch das Ergebnis "gibtsnicht".
Hat jemand eine Erklärung dafür?
http. Das hat nichts mit Dateien zu tun.
Aus irgendwelchen Gründen meinten die PHP-Leute, daß sie die PHP-Nutzer verwirren müssen und haben es daher ermöglicht, auf http-Ressourcen mit Datei-Funktionen zugreifen zu können.
cu,
Andreas