Экономим трафик. Увеличиваем скорость.
Во многих проектах по парсингу (обработке) большого количества страниц очень выгодно использовать сжатие страниц на стороне сервера-источника. Это помогает экономить трафик со всеми истекающими плюсами.
Как проверить может ли сервер-источник сжимать контент?
Методов на самом деле очень много. Я же пользуюсь связкой Mozilla + Live HTTP Headers.
Для того, чтобы проверить может ли сервер-источник сжимать страницу, я запускаю Mozilla, потом Live HTTP Headers и ищу в ответе на запрос броузера поле Content-Encoding. Конечно же для более глубокого понимания всего процесса взаимодействия было бы неплохо знать спецификацию HTTP 1.1, но в и без нее можно обойтись.
Типичный ответ сервера-источника может выглядеть так:

Как реализовать обработку «сжатых» страниц в своем PHP скрипте?
Для этого вам надо в своем коде сначала отправлять дополнительный заголовок. В своих скриптах я делаю это так:
…
$spider->AddHeaders[]=’Accept-Encoding: gzip’; // Как можно видеть на картинке выше, точно такое же поле отправляет и наш броузер
$spider->GetContent();
А внутри класса обрабатываем это дополнительное поле таким нехитрым кодом:
curl_setopt($this->curl_handler, CURLOPT_HEADER, $this->Headers);
После получения контента нам надо сделать еще одно необычное действие, добавив еще строку кода:
$spider->Result=gzinflate(substr($spider->Result,10));
После проведения этой операции в $spider->Result будет уже удобоваримый контент, который можно обрабатывать.
У вас также могут возникнуть вопросы по поводу числа 10 в функции substr. Скажу что выбрано оно не случайно :). Это связано с тем что моды Апача, которые занимаются сжатием, неправильно отдают заголовки сжатого контента. Мы же их обрезаем и просто «расжимаем» контент. Скаже сразу, что этот код будет работать в 90% процентах случаев. Если же у вас он по какой-то причине не работает, то советую почитать комменты к функции gzinflate на сайте php.net. Думаю там вы найдете ответы на все ваши вопросы.
Что мы получаем в результате использования данного подхода?
На самом деле получаем очень много. Мы экономим трафик и увеличиваем скорость обработки, что крайне важно на больших проектах, особенно если источник находится за много прыжков от нас (посмотреть это можно при помощи команды tracert в консольном режиме Windows).
По поводу скорости я провел пару исследований. Средняя скорость загрузки (10 последовательных тестов) со сжатием составила примерно 0.5 секунды, без сжатия - 0.85 секунды. Сайт-источник находился от меня на расстоянии 10 прыжков (а если говорить правильнее, 10 промежуточных точек или 10 маршрутизаторов). В вышеуказанное время уже включены накладные расходы на “расжатие” страниц для первого теста и на удаление всех вайтспейсес ([\n\r\t]) для обоих случаев.
Как мы видим выигрыш получился равным 70%!!! Поэтому советую для крупных проектов взять эту технику себе на вооружение.

[YS.PRO]:
Сжатие - полезная штука, но то ли я переработал, то ли забыл курс школьной математики, подскажите, откуда взялись 70% ???
6 Ноябрь 2008, 4:02 пп