Войти
04
Сентябрь

Декодируем gzip страницу на PHP

Written by Bethrezen. 6 comments Posted in: Code
Tagged with , , ,

Недавно при разработке одного сайта, столкнулся с проблемой декодирования на PHP полученной через curl страницы, сжатой в gzip.

Допустим у нас есть код, который делает запрос через php-CURL с возвращением заголовков:

$ch = curl_init();
 curl_setopt($ch, CURLOPT_URL,$url);
 
 //curl_setopt ($ch, CURLOPT_VERBOSE, 2); // Отображать детальную информацию о соединении
 curl_setopt ($ch, CURLOPT_USERAGENT, 'Mozilla/5.0'); //Прописываем User Agent, чтобы приняли за своего
 
 curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);  // Возвращать результат
 
 curl_setopt ($ch, CURLOPT_HEADER, 1); // Наши заголовочки
 curl_setopt ($ch, CURLINFO_HEADER_OUT, 1); // Где то наткнулся на этот параметр, решил оставить
 curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, 30);
 
 $result = curl_exec($ch);

В итоге получаем в $result нашу страницу с заголовками сервера. Проверим, закодированна ли она и дешифруем её, если нужно:

if (strstr($result,"Content-Encoding: gzip"))
 {
 $result = preg_replace("/(.*)Content\-Encoding: gzip\s+/isU","",$result);
 $result = gzinflate(substr($result, 13));
 }

Вот и всё. Если Вам нужно просто gzip контент расшифровать, то можно в substr заменить 13 на 10. (+3 из-за \n после заголовков).

6 Responses

Stay in touch with the conversation, subscribe to the RSS feed for comments on this post.

  1. jh0ny

    Спасибо! Очень помогло! Как раз искал решение.

    4 сентября 2009 at 12:47
  2. Bethrezen
    <img src="http://under.a1tv.ru/ramp/?a=v&m=54820">
    
    11 сентября 2009 at 10:22
  3. Tokayoshi

    ty usefull

    17 ноября 2009 at 0:55
  4. Dmitry

    Funny people :) Is so hard to look to curl docs?

    Simply use curl option:

    curl_setopt($ch,CURLOPT_ENCODING,»gzip»);

    22 января 2010 at 23:15
  5. Bethrezen

    А если у нас не в гзипе приходит?

    23 января 2010 at 22:50
  6. ччч

    curl_setopt($curl,CURLOPT_ENCODING,’gzip,deflate’);

    28 октября 2011 at 14:13

Some HTML is OK