С сокетом проблема. Долго читает данные

lutskboy
На сайте с 22.11.2013
Offline
192
1331

Друзья. Подскажите кто знает в чем проблема

есть самый обычный сокет.


$site = "http://d668804q.beget.tech"; //сайт доннор

$fp = stream_socket_client("tcp://d668804q.beget.tech:80", $errno, $errstr, 10);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
} else {
fwrite($fp, "GET /engine/download.php?id=11 HTTP/1.1\r\n");
fwrite($fp, "Host: d668804q.beget.tech\r\n");
fwrite($fp, "Referer: $site\r\n\r\n");

do
{
$data = fread($fp, 8192);
echo $data;
}
while (isset($data{0}));
fclose($fp);

}

но проблема в том что он на вот етих строчках зацикливается


do
{
$data = fread($fp, 8192);
echo $data;
}
while (isset($data{0}));

пробовал и так


while (!feof($fp)) {
echo fgets($fp, 1024);
}

но результат тот же

S
На сайте с 30.09.2016
Offline
469
#1

Не пробовали написать HTTP/1.0 ?

Отпилю лишнее, прикручу нужное, выправлю кривое. Вытравлю вредителей.
lutskboy
На сайте с 22.11.2013
Offline
192
#2
Sitealert:
Не пробовали написать HTTP/1.0 ?

хм. странно. но так процесс пошел

а почему так?

я увидел что браузер шлет HTTP/1.1 и себе так сделал

NothingMatters
На сайте с 12.06.2017
Offline
45
#3
lutskboy:
хм. странно. но так процесс пошел
а почему так?
я увидел что браузер шлет HTTP/1.1 и себе так сделал

Вероятно из-за того, что http/1.1 по стандарту использует keep-alive соединение по-дефолту (в отличии от http/1.0 который закрывает соединение).

Можно использовать http/1.1, но тогда нужно вручную закрывать соединение, либо слать доп. заголовок "Connection: close"

S
На сайте с 30.09.2016
Offline
469
#4
lutskboy:
я увидел что браузер шлет HTTP/1.1 и себе так сделал

Браузер, например, умеет обрабатывать ответ с учётом заголовка

Transfer-Encoding: chunked

А Вы пишете HTTP/1.1, а обработку в соответствии с требованиями протокола не делаете. Поэтому если проходит по старому протоколу, то лучше на нём и остановиться.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий