Fritz: Test ob file existiert

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

--
ie:( br:> va:} ls:[ fo:| ss:{ de:] js:| ch:? zu:)
http://webdesign.weisshart.de
  1. 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.

    1. 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

      --
      ie:( br:> va:} ls:[ fo:| ss:{ de:] js:| ch:? zu:)
      http://webdesign.weisshart.de
      1. 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

        --
        ie:( br:> va:} ls:[ fo:| ss:{ de:] js:| ch:? zu:)
        http://webdesign.weisshart.de
        1. 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)

          --
          „Tue niemals etwas ausschließlich weil es jemand anderer tut – auch wenn dieser unter deiner tiefsten Verehrung steht.“ | Mein SelfCode
          http://cdauth.de/
          1. 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.

            1. 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)

              --
              „Tue niemals etwas ausschließlich weil es jemand anderer tut – auch wenn dieser unter deiner tiefsten Verehrung steht.“ | Mein SelfCode
              http://cdauth.de/
              1. Lieber Biberacher,

                „Heißa, Caramba“

                Das erinnert mich an das Kinderlied "Heißa, Kathreinerle" ...

                Liebe Grüße aus Ellwangen,

                Felix Riesterer.

  2. 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

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    1. 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

      --
      ie:( br:> va:} ls:[ fo:| ss:{ de:] js:| ch:? zu:)
      http://webdesign.weisshart.de
      1. 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

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau
  3. 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

    --
    Warum nennt sich Andreas hier MudGuard?
    Schreinerei Waechter
    Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.