php при fgets fsockopen появляется мусор в html файле или что такое Transfer-Encoding: chunked

Почему когда грабишь сайт или делаешь копию другого сайта при помощи fgets и fsockopen появляется мусор в полученном html файле в видео строк с 3 символами.
Строки с тремя символами это шестнадцатеричный код размера блока. В режиме Transfer-Encoding: chunked сразу после заголовков идет размер следующего блока. И так через сокет вы поблочно получаете исходный урл.

Например открыли сокет, создали запрос и отправляете его:
$fs = fsockopen ($host, 80, $errno, $errstr, 30);
// out запрос
fwrite ($fs, $out);


после с помощью fgets() или stream_get_contents получаете поток от сервера, который передается методом чанк.
он будет примерно такой:

e5f
<!DOCTYPE HTML SYSTEM>
<HTML>
 <HEAD>
<br><br><br>
d8
<div style='background


где e5f и d8 это шестнадцатеричные числа которые показывают размер следующего блока в байтах. В конце потока обязательно должно быть \r\n0\r\n

Соответственно это надо учитывать и анализировать шапку ответа сервера, чтобы в php убирать эти информационные вставки.
Некоторые написали такой код, но вы можете упростить:

$buffer='';
$pos=strlen($head_text);
while (($size = hexdec(substr($response,$pos+2,($pnext=strpos($response, "\r\n", $pos+2)+2)-$pos-4))) != 0)
	{
		$buffer.=substr($response, $pnext, $size);
		$pos = $pnext+$size;
	}
$response = $head_text."\r\n".$buffer;



Оставить свой ответ:

Имя:*
E-Mail:
Вопрос:
Skolko buдет пять пдюс сeмь?
Ответ:*
QQpedia21.ru - cамые интересные вопросы