php при fgets fsockopen появляется мусор в html файле или что такое Transfer-Encoding: chunked
Почему когда грабишь сайт или делаешь копию другого сайта при помощи fgets и fsockopen появляется мусор в полученном html файле в видео строк с 3 символами.
Строки с тремя символами это шестнадцатеричный код размера блока. В режиме Transfer-Encoding: chunked сразу после заголовков идет размер следующего блока. И так через сокет вы поблочно получаете исходный урл.
Например открыли сокет, создали запрос и отправляете его:
после с помощью fgets() или stream_get_contents получаете поток от сервера, который передается методом чанк.
он будет примерно такой:
где e5f и d8 это шестнадцатеричные числа которые показывают размер следующего блока в байтах. В конце потока обязательно должно быть \r\n0\r\n
Соответственно это надо учитывать и анализировать шапку ответа сервера, чтобы в php убирать эти информационные вставки.
Некоторые написали такой код, но вы можете упростить:
Например открыли сокет, создали запрос и отправляете его:
$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;
Оставить свой ответ: