Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > gzip uncompress


Автор: console 19.11.2007, 13:23
Код

// $data - строка содержащая, данные упакованные gzip методом
ob_start();
header("X-Compression: gzip");
header("Content-Encoding: gzip");
header("Content-Length: ".strlen($data));
echo $data;
$data = ob_get_contents();
$uncompressed = gzuncompress($data);
file_put_contents('unc.txt', $uncompressed);
ob_end_clean();

die('<br>done');


Что в итоге: в файле unc.txt пусто, поиски по форуму показали, что не у меня одного такая проблема. Если не делать gzuncompress, то в файл записываются данные, но, как сами понимаете, в непонятном формате. Строчка в die которая не выводится, почему? И как решить проблему с распаковкой данных (мне нужно preg_match сделать) без PEAR и других библиотек?

Автор: teroni 19.11.2007, 13:35
А зачем хедеры добавляются?
Может формат $data не тот? gzinflate пробовали использовать?

Автор: console 19.11.2007, 13:39
Формат правильный, считываю страничку в gzip формате, gzinflate пробовал, то же самое.
Без хедеров некорректно отображаются данные. И почему все же не выводится текст после буферизации??

Автор: teroni 19.11.2007, 14:05
Честно говоря, не могу понять, что требуется сделать...
Расскажите по порядку, откуда берется $data, что с ней нужно сделать, что записать в файл и что выдать клиенту.
А 
Код

<?
header("X-Compression: gzip");
header("Content-Encoding: gzip");
header("Content-Length: 0");
echo '<br>done';
?>

тоже ничего не выведет.. Не надо левые заголовки добавлять!

Автор: console 19.11.2007, 14:09
Код

$data = GetPage('какой-то_урл.com');

ob_start();
header("X-Compression: gzip");
header("Content-Encoding: gzip");
header("Content-Length: ".strlen($data));
echo $data;
$data = ob_get_contents();
$uncompressed = gzinflate($data);
file_put_contents('unc.txt', $uncompressed);
ob_end_clean();
preg_match('#some_pattern#is', $uncompressed, $matches);
die('<br>done');



GetPage - функция, с помощью curl считывает страницу.
Далее мне надо распаковать gzip строку в обычную, чтобы с помощью preg_match() найти нужную информацию.

Автор: teroni 19.11.2007, 14:11
По-моему просто выкинуть лишнее надо!
Код

$data = GetPage('какой-то_урл.com');
$uncompressed = gzinflate($data);
file_put_contents('unc.txt', $uncompressed);
preg_match('#some_pattern#is', $uncompressed, $matches);

Автор: console 19.11.2007, 14:14
Код

$uncompressed = gzuncompress($data);
file_put_contents('unc.txt', $uncompressed);

die('<br>done');


если без хедеров, то выводится:

Код

Warning: gzuncompress() [function.gzuncompress]: data error in C:\webservers\home\localhost\www\yaparser2mail\scripts\translate_ru.php on line 30

done


Добавлено через 41 секунду
с gzinflate тоже ошибка  smile

Добавлено через 3 минуты и 4 секунды
Заголовки ответа сервера:

HTTP/1.x 200 OK
Server: nginx/0.5.33
Date: Mon, 19 Nov 2007 11:16:18 GMT
Content-Type: text/html; Charset=windows-1251
Transfer-Encoding: chunked
Connection: keep-alive
Keep-Alive: timeout=20
X-Powered-By: ASP.NET
Set-Cookie: UID=11315609239405; expires=Tue, 18-Nov-2008 21:00:00 GMT; path=/
Set-Cookie: LastVisit=19%2E11%2E2007; expires=Tue, 18-Nov-2008 21:00:00 GMT; path=/
Set-Cookie: lang=ru; expires=Wed, 18-Nov-2037 21:00:00 GMT; path=/
Cache-Control: private
Content-Encoding: gzip


настораживает chunked

Автор: teroni 19.11.2007, 14:22
Чтобы chunked`а не было проще всего слать запросы через протокол HTTP/1.0, чтобы gzip от сайтов расшифровывать gzinflate используется, либо в запросах указывается, что gzip не принимаем.

Автор: console 19.11.2007, 14:25
teroni, спасибо за совет )  smile 

Автор: kasmanaft 19.11.2007, 15:09
Попробуйте вот так:
Код
$data = GetPage('какой-то_урл.com');
$uncompressed = gzinflate(substr($data, 10, -8));
file_put_contents('unc.txt', $uncompressed);

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)