07 апреля 2006

Ускорение загрузки страниц

Мне, как девелоперу, всегда хотелось делать удобные системы. Один из критериев удобства работы с веб-приложением - скорость загрузки его страниц. Я использую два подхода, чтобы уменьшить размер хтмл-файла, чтобы он загружался быстрее:
  • оптимизация хтмл;
  • сжатие данных.

Оптимизация хтмл в данном случае - простое выкусывание лишних пробелов, которое, тем не менее, уменьшает размер файла в среднем на 20-25%. Я делаю это в два присеста:

  1. замена двух и более пробельных символов (табы, переносы) на один пробел;
  2. стирание пробелов между тэгами.

Вот такая простая функция:

function optimize_html($str)
{
$str = ereg_replace("[[:space:]]{2,}"," ", $str);
$str = ereg_replace(">[[:space:]]+<","><", $str);
return $str;
}



Сжатие данных позволяет передавать по каналу связи gzip-файл, который затем
прозрачно для пользователя разворачивается и отображается. В принципе, можно
использовать автоматическое сжатие всех страниц сервера на лету через включение
опции zlib.output_compression, но я от этого отказался, потому что я ещё и
кэширую страницы и храню в кэше сжатые файлы, а не plain html.

Вот как всё это выглядит в одной связке:

$_do_gzip = true
&& (int)ini_get("zlib.output_compression")==0
&& function_exists("gzencode")
&& eregi("gzip", $_SERVER['HTTP_ACCEPT_ENCODING']);

$_do_optimize_html = true;

ob_start(); //начать буферизацию вывода

... моё приложение чё-то делает...

if($_do_gzip)
{
$contents = ob_get_contents(); //останов буферизации
ob_end_clean();
if($_do_optimize_html)
$contents = optimize_html($contents);
$contents = gzencode($contents); //сжатие данных
header("Content-Type: text/html; charset=utf-8");
header("Content-Encoding: gzip");
echo $contents; //вывод в броузер
}



Ниже представлен график, показывающий изменение размера хтмл-файла в 4 состояниях:
  1. Исходный вариант (размер - 100%)
  2. Были выкушены пробелы (78% от исходного)
  3. Исходный файл был сжат (17%)
  4. Файл с выкушенными пробелами был сжат (15%)
график, показывающий изменение размера хтмл-файла

0 комментов:

Отправить комментарий