rabby: socket(header) vs fopen...

hallo welt !

dummerweise liefert das script, welches einen vergleich zwischen dem ermitteln einer datei mit fopen und dem senden von headern via sockets durchführen sollte, unterschiedliche ergebnisse :-(
liegt vielleicht daran, dass im hintergrund noch sämtliche andere prozesse aufs internet zugreifen.
leider kann ich die jetzt gerade nicht abstellen... deshalb möchte ich Euch bitten, es mal bei Euch auszuführen:

<?
$max=50;
?>
<?
$starttime=microtime();

$fp = fsockopen ("ipcheck.de", 80, $errno, $errstr, 30);
for($i=0;$i<=$max;$i++)
{
   fputs ($fp, "GET / HTTP/1.0\r\n\r\n");
   while (!feof($fp)) {
       $test= fgets($fp,128);
   }
}
   fclose($fp);
$runtime=(microtime()-$starttime);
echo "<br><br><br>$runtime milli sec";

?>
<?
$starttime=microtime();

for($i=0;$i<=$max;$i++)
{
fopen("http://ipcheck.de/","r");
}
$runtime=(microtime()-$starttime);
echo "<br><br><br>$runtime milli sec";

?>

die erste zeitangabe bezieht sich auf socket zugriff und die 2. auf fopen...

$max legt fest, wie oft die schleife durchgeführt werden soll... sowas is dann wohl ne annäherung, da es ja nicht immer das selbe ergibt...

danke!

  1. Halihallo rabby

    dummerweise liefert das script, welches einen vergleich zwischen dem ermitteln einer datei mit fopen und dem senden von headern via sockets durchführen sollte, unterschiedliche ergebnisse :-(

    Was hast du erwartet?

    liegt vielleicht daran, dass im hintergrund noch sämtliche andere prozesse aufs internet zugreifen.

    Eine Möglichkeit, von vielen...

    leider kann ich die jetzt gerade nicht abstellen... deshalb möchte ich Euch bitten, es mal bei Euch auszuführen:

    Ich halte den Benchmark für... Unsachdienlich. Argumentation folgt.

    $fp = fsockopen ("ipcheck.de", 80, $errno, $errstr, 30);
    for($i=0;$i<=$max;$i++)
    {
       fputs ($fp, "GET / HTTP/1.0\r\n\r\n");
       while (!feof($fp)) {
           $test= fgets($fp,128);
       }
    }
       fclose($fp);
    $runtime=(microtime()-$starttime);

    Was soll das hier? - Einmal Verbindung aufbauen und dann immer
    senden und wieder empfangen? - Nein, nein. Das ist a) nicht
    repräsentativ, denn fopen connected auch immer wieder und b)
    ist es falsch implementiert. Eine wiederverwendbare HTTP-Verbindung
    gibt es zwar (HTTP/1.1, Connection: keep-alive); grundsätzlich hält
    sich HTTP jedoch an Request/Response; die Verbindung stirbt also nach
    dem Antworten auf _eine_ Anforderung.

    $max legt fest, wie oft die schleife durchgeführt werden soll... sowas is dann wohl ne annäherung, da es ja nicht immer das selbe ergibt...

    Ja. Was willst du eigentlich messen? - Denn diese Frage ist für einen
    Benchmark _zentral_.

    Viele Grüsse

    Philipp

    1. im ersten punkt Deiner argumentation hast Du definitiv nicht recht...
      denn mein ziel ist es, herauszufinden, welche methode schneller ist, wenns drum geht, dateien von EINEM server herunterzuladen.
      hierbei hab ich genau sowas wie keep alive gesucht und nun gefunden... mal sehn, obs nun besser geht...

      1. Halihallo rabby

        im ersten punkt Deiner argumentation hast Du definitiv nicht recht...

        Depends... Wie gesagt: Du musst erst definieren, was du benchmarken
        willst. Ich ging davon aus, dass du fsockopen und fopen vergleichen
        willst.

        denn mein ziel ist es, herauszufinden, welche methode schneller ist, wenns drum geht, dateien von EINEM server herunterzuladen.

        Dann ist eine Kommunikation über Socket mit Unterstützung von
        Keep-Alive (persistent connections) Verbindungen sicher schneller,
        falls der entfernte Webserver es denn unterstützt.

        http://www.ietf.org/rfc/rfc2068.txt,
          Section 8.1 "Persistent Connections"

        hierbei hab ich genau sowas wie keep alive gesucht und nun gefunden... mal sehn, obs nun besser geht...

        Dann und _nur_ dann ist das Senden von mehreren Requests über eine
        Verbindung gestattet. Ansonsten sind - wie ich schon sagte - die
        fsockopen und -close Anweisungen innerhalb der for-Schleife zu
        setzen. Zudem: Dies wäre - wie ich schon sagte - mit dem fopen Befehl
        konformer (was mich zur Aussage verleitete, dass der Benchmark eben
        _unsachdienlich_ ist).

        Viele Grüsse

        Philipp

    2. Hello Philipp,

      $fp = fsockopen ("ipcheck.de", 80, $errno, $errstr, 30);
      for($i=0;$i<=$max;$i++)
      {
         fputs ($fp, "GET / HTTP/1.0\r\n\r\n");
         while (!feof($fp)) {
             $test= fgets($fp,128);
         }
      }
         fclose($fp);

      Nun hast Du mich ganz verunserichert.
      Wann stirbt die Verbindung denn normalerweise? Nach dem Response auf
      fputs ($fp, "GET / HTTP/1.0\r\n\r\n"); ?

      Oder sogar schon nach dem ersten fgets()?

      Liebe Grüße aus http://www.braunschweig.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      1. Halihallo Tom

        Nun hast Du mich ganz verunserichert.
        Wann stirbt die Verbindung denn normalerweise? Nach dem Response auf
        fputs ($fp, "GET / HTTP/1.0\r\n\r\n"); ?
        Oder sogar schon nach dem ersten fgets()?

        In HTTP/1.0 funktioniert alles schön einfach nach dem Muster Request-
        Response. Man sendet also ein GET / HTTP/1.0\015\012\015\012, ggf.
        noch ein paar zusätzliche Header dazwischen und bekommt dann vom
        Server eine Antwort. Diese Antwort besteht wiederum aus Header und
        Content (beim Request gibts diesen beim Versenden von Formularen
        über POST). _Nach_ dem Versenden des Contents wird auf Seiten des
        Servers die Verbindung geschlossen. Du kannst also in einer
        Verbindung nur eine Ressource anfordern.

        Mit anderen Worten: Sende den Request über die Socketverbindung und
        lese sie aus, bis nix mehr kommt (feof($sock)). Ganz einfach :-)

        Noch andere Worte: der Server schliesst die Verbindung, wenn er dir
        alle Daten gesendet hat. Diese Daten umfassen genau ein Entity, also
        Header und Content.

        Viele Grüsse

        Philipp