10 апреля 2009 :Про Gzip и магическое число 10Технологи фирмы где я работаю иногда делятся со мной своими заметками, вот одна из них. Не так много людей (не только разработчиков, а вообще), которые знают о том что сайты могут сжимать данные для экономии траффика, методом Gzip. Ещё меньше тех кто для той же экономии траффика решил программно скачивать (на PHP например) страницы именно в этом формате. И на этом начинается интересное. Допустим мы скачиваем яндекс, его интересней всего конечно, например заглавная страница: Warning: gzinflate(): data error in *** Изучив мануалы, находим крайне полезные замечания (на английском) Adler-32, который ожидает PHP. поэтому надо править так
function gzuncompress_crc32($data) {
$f = tempnam('/tmp', 'gz_fix');
file_put_contents($f, "\x1f\x8b\x08\x00\x00\x00\x00\x00" . $data);
return file_get_contents('compress.zlib://' . $f);
}
ну, как можно предположить And when retrieving mod_deflate gzip'ed content and using gzinflate() to decode the data, be sure to strip the first 11 chars from the retrieved content. $dec = gzinflate(substr($enc,11));" написан видимо тем же человеком, но уже в другом месте. Ну, читаем дальше When retrieving mod_gzip'ed content and using gzinflate() to decode the data, be sure to strip the first 10 chars from the retrieved content. $dec = gzinflate(substr($enc,10)); (что в переводе значит "2 байта отстой и не работает, надо обязательно отрезать 10 байт!") for($i=10;$i<20;$i++) echo $i.@gzinflate(substr($data,$i)); die(); я обнаружил что работает только echo gzinflate(substr($data,10)); на чём и заканчиваю историю P.S. итоге у меня первые 10 символов были с кодами 31,139,8,0,0,0,0,0,0,3, которые нужно всегда отрезать, а до этого как нетрудно догадаться 13,10,13,10 - двойной перевод строки который отделяет хидеры от тела документа.
|
Либо волшебно используйте ваш логин в Google, Яндекс, рамблер или ЖЖ чтобы войти через Open_ID

Комментарии: