PHP sockets langzaam
Ik ben nieuw met php, dus misschien is het wel heel logisch, maar ik wil het toch even navragen. Als ik php sockets gebruik gaat alles vrij vlug, maar als het lezen van een buffer klaar is duurt het nog heel lang voordat de socket gesloten wordt. Voorbeeld op http://84.31.72.237
Code die ik gebruik:
Zodra alle data al is gelezen duurt het dus nog een tijdje voordat "klaar, socket sluiten. " op het scherm verschijnt. Is daar een verklaring voor? Het werkt wel... alleen zeer langzaam helaas.
Code die ik gebruik:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?php
echo "begin!<br>";
flush();
$address = gethostbyname('www.xwis.net');
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
flush();
echo "verbinden naar $address" . ":" . "$service_port...<br>";
if (socket_connect($socket, $address, 80) < 0) {
echo "socket_connect() failed.\nReason: ($result) ";
}
else {
echo "socket gemaakt";
}
flush();
$in = "GET /xcl/?pid=51627 HTTP/1.1\r\n";
$in .= "Host: xwis.net\r\n\r\n";
$out = '';
echo "Sending HTTP GET request:" . $in . "...<br>";
socket_write($socket, $in);
flush();
echo "antwoord lezen:\n\n<xmp>";
flush();
while ($out = socket_read($socket,1024)) {
echo $out;
flush();
}
echo "</xmp> klaar, socket sluiten.\n\n";
socket_close($socket);
exit();
?>
echo "begin!<br>";
flush();
$address = gethostbyname('www.xwis.net');
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
flush();
echo "verbinden naar $address" . ":" . "$service_port...<br>";
if (socket_connect($socket, $address, 80) < 0) {
echo "socket_connect() failed.\nReason: ($result) ";
}
else {
echo "socket gemaakt";
}
flush();
$in = "GET /xcl/?pid=51627 HTTP/1.1\r\n";
$in .= "Host: xwis.net\r\n\r\n";
$out = '';
echo "Sending HTTP GET request:" . $in . "...<br>";
socket_write($socket, $in);
flush();
echo "antwoord lezen:\n\n<xmp>";
flush();
while ($out = socket_read($socket,1024)) {
echo $out;
flush();
}
echo "</xmp> klaar, socket sluiten.\n\n";
socket_close($socket);
exit();
?>
Zodra alle data al is gelezen duurt het dus nog een tijdje voordat "klaar, socket sluiten. " op het scherm verschijnt. Is daar een verklaring voor? Het werkt wel... alleen zeer langzaam helaas.
Ohja, open de site in IE omdat firefox pas de buffer uitleest zodra het de xmp sluittag heeft gevonden. Die komt dus juist te laat ;P
zzattack:
In Firefox is je socket anders sneller dan in IE ;-)Ohja, open de site in IE omdat firefox pas de buffer uitleest zodra het de xmp sluittag heeft gevonden. Die komt dus juist te laat ;P
uhm ik dacht dat ik de noob was ;P
iemand enig idee?
http://84.31.72.237
http://84.31.72.237/index.phps
http://84.31.72.237
http://84.31.72.237/index.phps
bump again
Door hem even door een script dat ik onlangs had gemaakt te halen krijg ik deze 2 grafiekjes. De zwarte lijn is de tijd die hij over die regel heeft gedaan, in totaal (alle rondjes bij elkaar opgeteld) en de rode is is het aantal maal dat hij die regels heeft uitgevoerd:

Hierbij is de regel met de top, regel 55, de }, het einde van de while-lus.
Ik heb je script even herschreven en het uitlezen binnen de lus gezet, in plaats van in de voorwaarde:

Inderdaad, regel 51 is de socket_read().
Dus ik dacht dat het aan socket_read lag, dat die gewoon heel sloom was. Echter, waneer ik hem vergelijk met een ander script van mijzelf, dat hetzelfde doet alleen dan via fsockopen viel me op dat ik 1 header meer meestuur, namelijk 'Connection: close'.
En stop ik die header ook in jouw script, doet hij het gewoon instant, zoals het hoort. socket_read() bleef dus tijd innemen, wachten totdat er nog wat kwam. De connection was immer niet dicht.
Oplossing:

Hierbij is de regel met de top, regel 55, de }, het einde van de while-lus.
Ik heb je script even herschreven en het uitlezen binnen de lus gezet, in plaats van in de voorwaarde:

Inderdaad, regel 51 is de socket_read().
Dus ik dacht dat het aan socket_read lag, dat die gewoon heel sloom was. Echter, waneer ik hem vergelijk met een ander script van mijzelf, dat hetzelfde doet alleen dan via fsockopen viel me op dat ik 1 header meer meestuur, namelijk 'Connection: close'.
En stop ik die header ook in jouw script, doet hij het gewoon instant, zoals het hoort. socket_read() bleef dus tijd innemen, wachten totdat er nog wat kwam. De connection was immer niet dicht.
Oplossing:
Nette uitleg Jelmer :)




