Расшифровать сжатую веб-страницу, полученную через cURL, в PHP

Я получаю сжатую веб-страницу через curl, но когда я выводю полученный контент в браузер, я получаю только необработанные сжатые данные. Как я могу расшифровать данные в PHP?

Один из найденных мной способов - записать содержимое в tmp-файл, а затем ...

$f = gzopen($filename,"r");
$content = gzread($filename,250000);
gzclose($f);

.... но, чувак, должен быть способ получше.

Изменить: это не файл, а сжатая html-страница, возвращаемая веб-сервером.


person Ian    schedule 22.11.2008    source источник
comment
Сжат ли сам файл с помощью gzip, или сервер сжимает его для передачи?   -  person Artelius    schedule 22.11.2008
comment
Не могли бы вы вместо декодирования данных gzip просто отправить правильные заголовки, чтобы браузер правильно их распознал? Или, если вы не хотите, чтобы он был сжат с помощью gzip, скажите cURL, чтобы он не запрашивал сжатые данные, установив для CURLOPT_ENCODING значение identity.   -  person nobody    schedule 22.11.2008


Ответы (2)


Я использую завиток и:

curl_setopt($ch, CURLOPT_ENCODING , "gzip");
person Jonas Lejon    schedule 17.05.2010
comment
Просто обратите внимание, что эта опция устанавливает заголовок Accept-Encoding: gzip в запросе и распаковывает ответ, если он сжат (это может быть не так), так что это действительно все, что вам нужно сделать. - person Synchro; 04.06.2013
comment
Идеальное решение для CURL. - person The Onin; 20.10.2016
comment
Установка его на 'gzip' будет всегда отправлять Accept-Encoding: gzip, даже если ваша версия PHP не поддерживает декодирование gzip (тогда вы получите сжатые данные). Если вы установите для него значение '' (пустая строка), curl автоматически объявит и декодирует все кодировки, которые он поддерживает. - person AndreKR; 01.02.2017

Универсальная функция 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;
person Maryam Jeddian    schedule 30.01.2011