Расшифровка сжатой веб-страницы, полученной через cURL в PHP - PullRequest
50 голосов
/ 22 ноября 2008

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

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

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

.... но, мужик, должен быть лучший путь.

Редактировать: Это не файл, а HTML-страница в формате gzipped, возвращаемая веб-сервером.

Ответы [ 3 ]

120 голосов
/ 17 мая 2010

Я использую curl и:

curl_setopt($ch,CURLOPT_ENCODING , "gzip");
2 голосов
/ 30 января 2011

Универсальная функция 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;
2 голосов
/ 22 ноября 2008

В комментариях на странице PHP для gzdecode .

предлагается несколько решений.
...