Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Verständnis non blocking stream

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] Verständnis non blocking stream

    Hi,

    ich möchte einen simplen REST-Client bauen. Der Client soll dabei möglichst wenig Zeit für einen Request brauchen. Auch die Rückgabe des Servers brauche ich nicht.

    Deshalb kann ich ja theoretisch einfach den Code aus der Doku zu [MAN]stream_socket_client[/MAN] verwenden:

    PHP-Code:
    <?php
    $fp 
    stream_socket_client("tcp://localhost:80"$errno$errstr30);
    if (!
    $fp) {
        echo 
    "$errstr ($errno)<br />\n";
    } else {
        
    fwrite($fp"GET /server.php HTTP/1.0\r\nHost: localhost\r\nAccept: */*\r\n\r\n");
        
    // while (!feof($fp)) { echo fgets($fp, 1024); }
        
    fclose($fp);
    }
    Wie ihr seht, hab ich das Lesen der Antwort einfach auskommentiert. Funktioniert wunderbar. Auch wenn das Serverskript 3 Sekunden braucht, wartet der Client nicht.

    Jetzt verstehe ich aber nicht ganz den Zusammenhang zu [MAN]stream_set_blocking[/MAN]. Das scheint ja das gleiche zu bewirken. Aber wozu brauche ich das dann, wenn ich doch das Lesen auslassen kann?

    Und dann gibts bei stream_socket_client auch noch den Flag STREAM_CLIENT_ASYNC_CONNECT. Was bewirkt der dann?

    Viele Grüße,
    Christoph
    http://mcsodbrenner.blogspot.com/
    Serpent PHP Template Engine: http://code.google.com/p/serpent-php-template-engine/

  • #2
    Zitat von McSodbrenner Beitrag anzeigen
    Jetzt verstehe ich aber nicht ganz den Zusammenhang zu [MAN]stream_set_blocking[/MAN]. Das scheint ja das gleiche zu bewirken. Aber wozu brauche ich das dann, wenn ich doch das Lesen auslassen kann?
    Gar nicht...

    Ein Socket blockiert, wenn du lesen willst, aber der Server gar nichts sendet...im schlimmsten Fall bis zum Sankt Nimmerleinstag. Da du aber nicht liest, blockiert dein Socket auch nicht, ergo brauchst du auch kein non-blocking socket.

    STREAM_CLIENT_ASYNC_CONNECT ist im Prinzip das gleiche, nur für den Verbindungsaufbau: Wenn der Server, den du versuchst zu erreichen, nicht verfügbar ist, blockiert das Socket (bis zum Timeout). Bei asynchronem Connect kehrt es sofort zu dir zurück, egal ob die Verbindung bereits aufgebaut werden konnte oder nicht (du musst dann VOR dem lesen/schreiben auf das Socket überprüfen, ob der Socket verbunden ist...)
    Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

    Kommentar


    • #3
      Ah, danke.
      Wenn ich das richtig verstehe, macht dann ein non-blocking request nur Sinn, wenn man mehrere Requests absendet, richtig? Weil man dann mehrere gleichzeitig abarbeiten kann, oder? Und dann benutzt man am besten auch beide Funktionen, ja?
      Gibt es noch andere Anwendungsfälle dafür?
      http://mcsodbrenner.blogspot.com/
      Serpent PHP Template Engine: http://code.google.com/p/serpent-php-template-engine/

      Kommentar


      • #4
        Zitat von McSodbrenner Beitrag anzeigen
        Ah, danke.
        Wenn ich das richtig verstehe, macht dann ein non-blocking request nur Sinn, wenn man mehrere Requests absendet, richtig? Weil man dann mehrere gleichzeitig abarbeiten kann, oder?
        Auf einem Socket kannst du trotzdem nur einen Request absetzen. Aber ja, um mehrere parallele Requests verarbeiten zu können legt man x non-blocking Sockets an und holt für jedes Socket die Daten nach und nach asynchron ab... quasi-gleichzeitig.
        Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

        Kommentar


        • #5
          Danke!
          http://mcsodbrenner.blogspot.com/
          Serpent PHP Template Engine: http://code.google.com/p/serpent-php-template-engine/

          Kommentar

          Lädt...
          X