Я извлекаю 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;