Tommy: fsockopen - ist das so richtig?

Hi!

So, nachdem ich gestern keine sehr große Resonanz auf meinen Beitrag zur Feststellung der Existenz einer externen Datei erhielt, habe ich nun die Sache selbst in die Hand genommen. Es hat mich zwar 1 1/2 Stunden Suche im Internet gekostet, aber hier das Ergebnis:

if(fsockopen("$daten[extern]",80,$errno,$errstr,30))

Erläuterung: Also, ich möchte mit einer if-Abfrage feststellen, ob die Datei (Link zur dieser ist im Array gespeichert) vorhanden ist. Es klappt jedoch noch nicht so richtig, da mir die Funktion ein FALSE zurückgibt, die Datei jedoch besteht. Mir ist allerdings auch nicht klar, was die Variablen $errno und $errstr bewirken. Ich habe sie nur aus dem Beispiel übernommen.

Was ist falsch?

Tommy

  1. So, nachdem ich gestern keine sehr große Resonanz auf meinen Beitrag zur Feststellung der Existenz einer externen Datei erhielt, habe ich nun die Sache selbst in die Hand genommen.

    Lobenswert, denn selber suchen macht schlau (ernst gemeint). Warum Du "keine große Resonanz" bekommen hast, wurde Dir allerdings schon gesagt. Mit "Ich habe keine Ahnung" und "xy() funktioniert nicht" kann hier keiner was anfangen. Auf präzise Fragen bekommst Du hier auch präzise Antworten. Aber mit Problemen, bei denen man erstmal zwei Stunden überlegen muß, was denn nun gemeint sein könnte, mag sich hier kaum jemand rumschlagen.

    if(fsockopen("$daten[extern]",80,$errno,$errstr,30))

    Erläuterung: Also, ich möchte mit einer if-Abfrage feststellen, ob die Datei (Link zur dieser ist im Array gespeichert) vorhanden ist. Es klappt jedoch noch nicht so richtig, da mir die Funktion ein FALSE zurückgibt, die Datei jedoch besteht. Mir ist allerdings auch nicht klar, was die Variablen $errno und $errstr bewirken. Ich habe sie nur aus dem Beispiel übernommen.

    Also ich rate Dir, nicht irgendwo zu suchen, sondern einfach in die PHP-Anleitung zu schauen. Dann hättest Du..

    ..festgestellt, daß fsockopen() dazu dient, eine Netzwerkverbindung zu einem Server herzustellen und somit nicht sonderlich viel mit Dateien zu tun hat. Vielleicht möchtest Du ja lieber fopen("http://xxx") benutzen.

    ..gewusst, daß in $errno und $errstr die Fehlernummer und den Text dazu enthalten.

    ..sicher das Kapitel "Funktionen des Dateisystems" gefunden und wärest dort über eine Funktion namens file_exists() gestolpert.
    Falls Dir die Funktion nicht passt, dann beherzige bitte obigen Kommentar zu Deiner ursprünglichen Fragestellung.

    Wo man die PHP-Anleitung findet? Probier' mal http://php.net :)

    Darüberhinaus müsste es wenn, dann

    fsockopen($daten["extern"],80,$errno,$errstr,30)

    lauten.

    Gruß,
      soenk.e

    1. Aloha!

      Lobenswert, denn selber suchen macht schlau (ernst gemeint).

      Kann ich nur unterstützen.

      Also ich rate Dir, nicht irgendwo zu suchen, sondern einfach in die PHP-Anleitung zu schauen. Dann hättest Du..

      ..festgestellt, daß fsockopen() dazu dient, eine Netzwerkverbindung zu einem Server herzustellen und somit nicht sonderlich viel mit Dateien zu tun hat. Vielleicht möchtest Du ja lieber fopen("http://xxx") benutzen.

      Nö, fsockopen() ist schon ganz gut. Allerdings muß man dann HTTP sprechen mit dem Server.

      In detailliert:

      fsockopen öffnet einen Kommunikationskanal zum Server. Und weiter nichts. Wenn man wissen möchte, ob URL xy verfügbar ist, muß man das dann sagen.

      Es ist ja aber nicht so, daß findige Leute das nicht schon vorgekaspert hätten. In einer der vielen Threads zu diesem Thema schrieb ich unlängst, daß php.net ein Beispiel zu diesem Problem liefert. Dazu http://www.php.net besuchen und die Befehlsbeschreibung zu fsockopen ansteuern (Eingabefeld oben rechts).

      Das erste Beispiel in der Beschreibung liest mit fsockopen eine URL aus und zeigt sie mit echo an. Anstatt die ganze Datei mit "GET /" zu holen, wäre zum Prüfen, ob die URL existiert, ein "HEAD /" ganz praktisch. Zurück kommen dann nur ein paar HTTP-Header vom Server, aus denen man Erfolg oder Mißerfolg entnehmen kann. Die Statuswerte der 200er und 300er-Serie sind als Erfolg zu werten (URL existiert), 400er und 500er sind ein Mißerfolg.

      - Sven Rautenberg

      1. So! Ich habe es mal ausprobiert. Leider erhalte ich als Fehlercode 0.

        1. Aloha!

          So! Ich habe es mal ausprobiert. Leider erhalte ich als Fehlercode 0.

          Was ist "es"? Quellcode?

          Ich habe gerade das erste Beispiel von php.net 1:1 kopiert und ausgeführt (mit der Anpassung von Servername und URL natürlich). Hat bestens geklappt.

          Wenn du "GET" durch "HEAD" ersetzt, ist die Serverantwort kürzer.

          Unten ist jenes erste Beispiel mal angegeben. Einzige Änderung: htmlentities im echo (damit der HTML-Quelltext ausgegeben wird und nicht wirksam wird) und <pre> drumherum für bessere Formatierung der Ausgabe.

          <pre>
          <?php
          $fp = fsockopen ("www.example.com", 80, $errno, $errstr, 30);
          if (!$fp) {
              echo "$errstr ($errno)<br>\n";
          } else {
              fputs ($fp, "HEAD / HTTP/1.0\r\nHost: www.example.com\r\n\r\n");
              while (!feof($fp)) {
                  echo htmlentities(fgets ($fp,128));
              }
              fclose ($fp);
          }
          ?>
          </pre>

          Der Server example.com existiert übrigens! Dieses Beispiel funktioniert in dieser Form bestens.

          - Sven Rautenberg

          1. Stimmt! Das Beispiel funktioniert. Ich glaube jedoch, dass ich lieber die Arbeit auf mich nehmen soll, in zeitlichen Abständen die Links selber zu überprüfen, da mir diese Methode etwas unkompatibel und unpraktisch aussieht.

            Tommy

            1. Aloha!

              Stimmt! Das Beispiel funktioniert. Ich glaube jedoch, dass ich lieber die Arbeit auf mich nehmen soll, in zeitlichen Abständen die Links selber zu überprüfen, da mir diese Methode etwas unkompatibel und unpraktisch aussieht.

              Stimmt, denn es verlangsamt den Seitenaufbau erheblich. Für jeden zu prüfenden Link muß eine Verbindung zum Server aufgebaut werden, was seine Zeit dauert: Erst per DNS-Anfrage die IP herausfinden (das dauert am längsten), dann Kontakt zum Server herstellen, und schließlich die Abfrage.

              Ich hatte andernorts auch schon darauf hingewiesen und gemeint, es wäre günstiger, diese Aufgabe nicht bei jedem Seitenabruf zu erledigen, sondern einen Cache zu stricken, der diese Aufgabe beschleunigen kann.

              In der Tat ist es günstiger, wenn du manuell oder per Script (das System kannst du dir ja zu eigen machen, wenn die Links in einer Datenbank etc. stehen) regelmäßig nachschaust, ob noch alles OK ist.

              Ansonsten kann ich auch den Linkchecker vom W3C empfehlen: http://validator.w3.org/checklink.

              - Sven Rautenberg

              1. Hallo Sven,

                zwei kleine Sachen: bei deinem Beispiel bitte '\015\012' benutzen
                statt '\n\r'. Dann klappts auch unter Windows richtig :)

                Erst per DNS-Anfrage die IP herausfinden (das dauert am längsten)

                Nein. Es gibt natuerlich einen DNS-Cache, statistisch ist das der
                Teil, der am wenigsten lange dauert. Es kann natuerlich sein, dass
                man Pech hat und gerade zu dem Augenblick zugreift, wo die TTL
                abgelaufen ist und ein neuer Lookup gemacht werden muss. Aber das
                sollte, wie gesagt, selten sein. Und selbst dann kommt es darauf an,
                wie verzwickt der Lookup ist: steht der Nameserver im selben oder
                einem benachbarten Subnetz, geht es blitzschnell. Steht der
                Nameserver in einem weit entfernten Subnetz, wo ueber tausend andere
                Subnetze geroutet werden muss, geht das natuerlich sehr langsam.
                Pauschalisierung finde ich *gerade* hier sehr falsch.

                Gruesse,
                 CK