Я извлекаю gzipped веб-страницу через curl, но когда я выводя полученный контент в браузер, я просто получаю необработанные gzipped данные. Как я могу декодировать данные в PHP?
Один из методов, который я нашел, – это записать содержимое в файл tmp, а затем …
$f = gzopen($filename,"r"); $content = gzread($filename,250000); gzclose($f);
…. но человек, должен быть лучший способ.
Изменить: это не файл, а gzipped html-страница, возвращаемая веб-сервером.
Я использую завиток и:
curl_setopt($ch,CURLOPT_ENCODING , "gzip");
В комментариях на странице PHP для gzdecode предлагается несколько решений.
Универсальная функция GUNZIP:
функция gunzip ($ zipped) {
$ offset = 0;
if (substr ($ zipped, 0,2) == "\ x1f \ x8b")
$ offset = 2;
if (substr ($ zipped, $ offset, 1) == "\ x08") {
# file_put_contents ("tmp.gz", substr ($ zipped, $ offset - 2));
return gzinflate (substr ($ zipped, $ offset + 8));
}
return «Неизвестный формат»;
}
Пример интегрирующей функции с CURL:
$ headers_enabled = 1;
curl_setopt ($ c, CURLOPT_HEADER, $ headers_enabled)
$ ret = curl_exec ($ c);
if ($ headers_enabled) {
# file_put_contents ("preungzip.html", $ ret);
$ sections = explode ("\ x0d \ x0a \ x0d \ x0a", $ ret, 2);
while (! strncmp ($ sections [1], 'HTTP /', 5)) {
$ sections = explode ("\ x0d \ x0a \ x0d \ x0a", $ sections [1], 2);
}
$ headers = $ sections [0];
$ data = $ sections [1];
if (preg_match ('/ ^ Content-Encoding: gzip / mi', $ headers)) {
printf ("gzip header found \ n");
return gunzip ($ data);
}
}
return $ ret;