Я получаю сжатую веб-страницу с помощью curl, но когда я выводю полученный контент в браузер, я получаю только необработанные сжатые данные. Как я могу расшифровать данные в PHP?
Я нашел один метод - записать содержимое в файл tmp, а затем ...
$f = gzopen($filename,"r");
$content = gzread($filename,250000);
gzclose($f);
.... но, чувак, должен быть способ получше.
Обновлено: это не файл, а сжатая html-страница, возвращаемая веб-сервером.
Можете ли вы вместо декодирования данных gzip просто отправить правильные заголовки, чтобы браузер правильно их распознал? Или, если вы не хотите, чтобы он был сжат с помощью gzip, скажите cURL, чтобы он не запрашивал сжатые данные, установив для CURLOPT_ENCODING значение "identity".






Я использую завиток и:
curl_setopt($ch,CURLOPT_ENCODING , "gzip");
Просто отметим, что эта опция устанавливает заголовок Accept-Encoding: gzip в запросе. и распаковывает ответ, если он сжат (это может быть не так), так что это действительно все, что вам нужно сделать.
Идеальное решение для CURL.
Установка его на 'gzip' приведет к тому, что всегда отправит Accept-Encoding: gzip, даже если ваша версия PHP не поддерживает декодирование gzip (тогда вы получите сжатые данные). Если вы установите его на '' (пустая строка), curl автоматически объявит и декодирует все кодировки, которые он поддерживает.
Универсальная функция GUNZIP:
function 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 "Unknown Format";
}
Пример интеграции функции с 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;
Сжат ли сам файл с помощью gzip или сервер сжимает его для передачи?