socket(header) vs fopen...
rabby
- php
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!
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
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...
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
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
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