Экономия трафика благодаря HEAD

Уменьшим трафик и упростим ответы от сервера благодаря методу HEAD, который запрашивает только информацию о файле и ресурсе.

Метод HEAD аналогичен методу GET, за исключением того, что сервер ничего не посылает в информационной части ответа. Метод HEAD запрашивает только информацию о файле и ресурсе, т.е. ничего кроме заголовков не возвращает. Этот метод используется, когда клиент хочет найти информацию о документе, не получая его. Удобно, когда нужно узнать размер файла, существует ли файл, когда последний раз изменялся файл. Позволяет сэкономить много времени и трафика.

Состав заголовка запроса HEAD должен быть такой же, как в запросе GET.

Пример метода HEAD

<?php
// открываем сокет
$fp = fsockopen('yapro.ru', 80, $errno, $errstr, 5);
if (!$fp) {
echo $errno; // ошибка подключения
}
else {
// формируем http-заголовки к серверу
$request = "HEAD /download/file.txt HTTP/1.0\r\n";
$request .= "Host: yapro.ru\r\n";
$request .= "User-Agent: Mozilla/2.0\r\n";
$request .= "Connection: close\r\n\r\n";
 
// отсылаем запрос серверу
fputs($fp, $request);
 
// получем ответ от сервера
$content = '';
while(!feof($fp) ){
$content .= fgets($fp);
}
echo $content;
fclose($fp);
}
?>

Как мы видим, содержимое файла в ответ на запрос HEAD не передается. Приходят только заголовки

HTTP/1.1 200 OK
Server: nginx/0.6.32
Date: Sat, 24 Apr 2010 14:19:41 GMT
Content-Type: text/plain; charset=UTF-8
Connection: close
Last-Modified: Sat, 24 Apr 2010 13:19:02 GMT
ETag: "43ace4b-b-4bd2efc6"
Accept-Ranges: bytes
Content-Length: 11

Теперь заменим в исходном коде метод HEAD на метод GET

<?php
// открываем сокет
$fp = fsockopen('yapro.ru', 80, $errno, $errstr, 5);
if (!$fp) {
echo $errno; // ошибка подключения
}
else {
// формируем http-заголовки к серверу
$request = "GET /download/file.txt HTTP/1.0\r\n";
$request .= "Host: yapro.ru\r\n";
$request .= "User-Agent: Mozilla/2.0\r\n";
$request .= "Connection: close\r\n\r\n";
 
// отсылаем запрос серверу
fputs($fp, $request);
 
// получем ответ от сервера
$content = '';
while(!feof($fp) ){
$content .= fgets($fp);
}
echo $content;
fclose($fp);
}
?>

Ответ аналогичен, но теперь сервер отправил еще содержимое файла:

HTTP/1.1 200 OK
Server: nginx/0.6.32
Date: Sat, 24 Apr 2010 15:04:36 GMT
Content-Type: text/plain; charset=UTF-8
Connection: close
Last-Modified: Sat, 24 Apr 2010 13:19:02 GMT
ETag: "43ace4b-b-4bd2efc6"
Accept-Ranges: bytes
Content-Length: 11
 
bla-bla-bla

Размер файлика всего 11 байт. Представим, что в файл весит 11 Мб и запрашивается каждую секунду (например, последние обновления продуктов компании). Если внешнее приложение будет запрашивать данный файл напрямую каждую секунду, то трафик будет расти как на дрожжах.

Кстати, подобная схема используется у нас на работе, за тем исключением, что рядом с большим xml-файлом лежит маленький файлик в несколько байт, в котором хранится md5–хэш от большого файла. Таким образом, сделав сначала GET-запрос к маленькому файлу с md-хэшем, мы узнаем нужно ли нам делать запрос к основному файлу. md5-хэш хранится у нас в кэше для того чтобы сравнить его с содержимым md5-файлика на удаленном сервере. В данном примере не используется метод HEAD, но принцип экономии ресурсов и трафика аналогичен методу HEAD.

Источник: ekimoff.ru

Оцени публикацию:
  • 4,16
Оценили человек: 4

Похожие статьи:

Справочники и учебники:


Предложения и пожелания:
Ваше имя:
Ваш E-mail:
Введите изображенные цифры:
Captcha
Главная
X

youtube.com/watch?v=7hFivbgIEqk

При полном или частичном использовании материалов данного сайта, ссылка на сайт "yapro.ru" обязательна как на источник информации.
Автоматический импорт материалов и информации с сайта запрещен.
Copyrights © 2007 - 2017 YaPro.Ru

Главная » Веб-мастеру » PHP »