2008-11-22 7 views
46

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

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

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

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

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

+0

Is сам файл архивированная, или сервер gzipping его для передачи? – Artelius 2008-11-22 01:05:09

+2

Вместо декодирования данных gzip вы могли бы просто отправить правильные заголовки, чтобы браузер правильно распознал их? Или, если вы не хотите, чтобы это было в первую очередь, скажите cURL не запрашивать данные gzipped, установив CURLOPT_ENCODING на «identity». – 2008-11-22 01:19:17

ответ

101

Я использую локон и:

curl_setopt($ch,CURLOPT_ENCODING , "gzip"); 
2

Универсальный 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;