как распаковать gzip файл?

Статус
В этой теме нельзя размещать новые ответы.

satih

Хранитель порядка
Регистрация
19 Сен 2008
Сообщения
401
Реакции
721
после запроса через curl с "Accept-Encoding: gzip,deflate" получаю сурс сжатый gzip-ом. пытаюсь раскрыть его содержимое с gzuncompress или gzinflate получаю ошибку
C:\Documents and Settings\Administrator>PHP Warning: gzinflate(:( data error in C:\test.php on line 44
с записью в промежуточный файл и распаковкой работает
PHP:
file_put_contents('gziped', $html);
$zd = gzopen('gziped', "r");
$contents = gzread($zd, 1000000);
gzclose($zd);
file_put_contents('unzipped', $contents);
но хотелось бы не записывать в промежуточный сжатый файл, а сразу распаковать полученый запрос
 
в курле есть опция CURLOPT_ENCODING для декодирования сжатого ответа


для теста
PHP:
header('Content-Type: text/plain; charset=utf-8');

$c = curl_init();
curl_setopt($c, CURLOPT_URL, 'http://ya.ru');
curl_setopt($c, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($c, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6");
curl_setopt($c, CURLOPT_TIMEOUT, 30);
curl_setopt($c, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($c, CURLOPT_HEADER, 1);
curl_setopt($c, CURLOPT_REFERER, 'http://ya.ru');

//даёшь gzip!
curl_setopt($c, CURLOPT_HTTPHEADER, array('Accept-Encoding: gzip,deflate'));
//раскодируем gzip на лету
curl_setopt($c, CURLOPT_ENCODING, 1);

$response = curl_exec($c);
curl_close($c);

echo $response;
 
Отлично, то что нужно было, по ману на пхп.ком думал CURLOPT_ENCODING просто в хедер вставляет Accept-Encoding нужный, оказывается распаковка на лету (плюс вставляет нужный стринг в хедер).. курл не прекращает удивлять :)
PHP:
curl_setopt($c, CURLOPT_ENCODING, 'gzip,deflate');
сделал то что надо в данном случае. почему
PHP:
curl_setopt($c, CURLOPT_HTTPHEADER, array('Accept-Encoding: gzip,deflate'));
curl_setopt($c, CURLOPT_ENCODING, '1');
работает, не ясно, по ману опции могут быть gzip, deflate и/или identity, если оставить пустым то будут все три, тут видно CURLOPT_HTTPHEADER делает правильный хедер, а курл уже расшифровывает полученое.. иначе сложно объяснить, потому что только
PHP:
curl_setopt($c, CURLOPT_ENCODING, '1');
посылает в хедере
PHP:
'Accept-Encoding: 1'
и соотвественно получает несжатый хтмл, а только
PHP:
curl_setopt($c, CURLOPT_ENCODING, 'gzip,deflate');
(без CURLOPT_HTTPHEADER) ставит в хедере
PHP:
'Accept-Encoding: gzip,deflate'
и распаковывает
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху