Peter Mairhofer: Timeout bei Request

Hallo,

Ich fordere eine einfache Seite mit
$arr = file("http://server.domain.tld/file");
an.

Wichtig ist dabei eben, dass es unkompliziert ist, d.h. dass ich nicht irgendwelche Sockets verwenden muss sondern nur diese High-Level Funktion.

Der Inhalt ist aber nicht 100% essentiell, also will ich nicht, dass bei langsamer Verbindung die ganze Seite steht, also würde ich gerne ein Timeout definieren können, sodass die Datei nur angezeigt wird, wenn eben die Verbindung schnell genug ist, sonst irgendeine Meldung kommt.

Any ideas?

Thx

Peter

  1. Hello,

    da kann man was basteln mit register_tick_function().

    Lies die Datei nicht mit File() ein, sondern mit

    fread($fp,512) in einer Schleife. In der Schleife lässt Du einen einen Zähler decrementieren. Durch die Tick-Funktion lässt Du ihn wieder incrementieren.

    Nun musst Du nur den Startwert, die untere und die obere Schranke bestimmen. Wenn der Zähler bei der nächsten Tick-Funktion zu hoch wird, brichst Du das Download ab, indem Du einfach die Connection schließt (fclose($fp)) und die Downloadfunktion beendest (die hört mit Fehler dann von alleine auf. Den Read-Error würd eich auswerten...

    Grüße

    Tom

    1. Hello,

      außerdem könntest Du auch mal

      default_socket_timeout integer
      Standardtimeout (in Sekunden) für Socket basierte Streams.

      Anmerkung: Diese Konfigurationsoption wurde in PHP 4.3 eingeführt.

      ausprobieren. Auch wenn Du direkt nicht mit den Sockets in Berührung kommst, sind die ja trotzdem im Spiel. Ich wollte das neulich auch schon ausprobieren, bin aber drüber weggekommen.

      Schaun wir mal, was passiert, wenn man das auf 2 setzt.

      Grüße

      Tom

      1. Hello,

        außerdem könntest Du auch mal

        default_socket_timeout integer Standardtimeout (in Sekunden) für
        Socket basierte Streams.

        Anmerkung: Diese Konfigurationsoption wurde in PHP 4.3 eingeführt.

        <?php   #### timeout.php ####

        $timeout = 60; if (is_numeric($_GET["ti"])) {   $timeout =
        intval($_GET["ti"]); }

        ini_set("default_socket_timeout",$timeout);

        echo "Timeout: ".ini_get("default_socket_timeout")."<br />";

        readfile("http://forum.de.selfhtml.org");

        ?>

        Ich konnte nichts feststellen. Allerdings ist das Forum heute auch
        recht gut erreichbar. Ich denke, dass dieser Wert bei jedem Dateninput
        auf dem Port wieder resettet wird, also von vorne anfängt zu zählen.
        Da wird dann die Tick-Methode schon bessere Ergebnisse liefern.

        Aber mal 'ne andere Frage (diesmal nicht im extra-Thread):

        Wieso bekomme ich das Forum mit o.a. Script nur ohne CSS und ohne
        Bilder. Der Client müsste das doch trotzdem richtig anfordern.

        Grüße

        Tom

        1. Hello,

          und noch mehr Forschungsergebnisse:

          Die Klamotte mit register_tick_function() können wir für diese Aufgabenstellung vergessen, da sie leider _nicht_ den Handler an den Userinterrupt 1Ch (bei Intel-Maschinen) oder so ähnlich (bei anderen...) anbindet.

          Sie lässt den Handler auf das Weiterschalten von Statements reagieren. Wenn aber das fread() hängt, wird da auch nichts "weitergeschaltet" und es wird demnach kein Tick ausgelöst.

          Schade eigentlich

          Da ist ja JavaScript schlauer!

          Grüße

          Tom