Как увеличить скорость загрузки сайта путем кэширования сайта и буферизации вывода

Увеличенине скорости загрузки сайта  Опубликовано: 2010-04-14    Просмотров: 5861  Алексей Фомичев пишет:
Увеличенине скорости загрузки сайта

Я думаю, для вас не будет огромной тайной, если я вам сообщу, что статичные страницы загружаются намного быстрее, чем динамичные. Все достаточно просто. Статические страницы сразу же после запроса к ним обрабатываются браузером.

С динамическими страницами чуть сложнее. Они сначала обрабатываются сервером, делаются запросы к базе данных и только потом отдается браузеру. Как вы понимаете время, затраченное на обработку страниц - увеличивается.

Я предлагаю вам реально работающую систему кэширования страниц с буферизацией вывода. Данный скрипт прекрасно работает в рамках CMS AF. Что делает данная система:

- записывает все, что происходит на сервере в файл;
- сохраняет данный файл для дальнейшего обращения к нему.

Сразу скажу, что данные сохраняются в статическом виде. Это дает нам огромное преимущество: ускорение загрузки страниц и снижение нагрузки на сервер, и базу данных.

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

Хватит теории - переходим к действию.

Что нам понадобиться для того чтобы увеличить скорость загрузки сайта:

ob_start() – функция включения буферизации вывода. Все, что будет происходить после этой функции, будет сохранено во временное хранилище;
ob_get_contents() - вывод содержимого из временного хранилища;
ob_end_flush() - выключает буферизацию вывода, но перед этим отправляет содержимое буфера вывода пользователю и очищает буфер;

Для осуществления кэширования сайта используем инструменты для работы с файлами.

fopen() - открывает файл или URL
fwrite() - записывает содержимое в файл.
fread() – читает данные из файла.
fclose() - закрывает файл.

На сервере организуем папочку cache (назвать ее вы можете как угодно), в которой будем сохранять наши статичные файлы. Так же необходимо заготовить базу данных со следующими полями page и id. В поле page записывается название страницы: index, index1, index2 и т.д. Конечно, название страницы я привел условно в качестве примера.

Теперь внимательно читайте. Реализация скрипта на примере индексной страницы.

В верхней части страницы подключаем php блок:


# Соединение с базой данных.
  $db = mysql_connect ("localhost","Ваш логин,"Ваш пароль");
  mysql_select_db ("Название базы данных",$db);

  $r_inx = mysql_query 
   ("SELECT * FROM $set WHERE page='index'",$db);

  if (mysql_num_rows($r_inx)>0)
   {$inx = mysql_fetch_array ($r_inx);}
    else
    {
     echo "Невозможно вывести страницу. В таблице нет данных"; 
    }

где, $set – таблица, которая содержит поля id и page

Далее подключаем блок кэширование страницы.


# Подключаем блок кеширование страниц
  $cachedir = $_SERVER['DOCUMENT_ROOT'].'/cache/';
  $thispage = ''.$inx["page"].'_'.$inx["id"].'';
  $cachelink = $cachedir.md5($thispage).".html";

В последней строке применяем функцию MD5 для последующего сравнения хеш-данных.

Переходим к проверки времени жизни вашего кеша и вывод страницы.


  $cachetime = 60; # время жизни кэша (в сек.)
  if (file_exists($cachelink)) 
  {	
  $cachelink_time = filemtime($cachelink);
  # если кэш еще не устарел, читаем страницу
  # из файла и отдаем браузеру
  if ((time() - $cachetime) < $cachelink_time) 
   {
  # Оптимизируем страницу удаляя лишние пробелы.
    $handle = fopen($cachelink, 'r');
    $fileData = fread($handle, filesize($cachelink));
    fclose($handle);
    echo $handle;
     die();
   }
  }
  ob_start();

Я думаю тут комментарии лишние. Все уже описано. Как вы наверное заметили осуществляется проверка файла по временному интервалу, а далее происходит его открытие и вывод через переменную в окно браузера. Если время страницы жизни истекло, то отправляем код на функцию включения буферизации вывода.

В конце страницы прописываем следующий код:


   $fp = fopen($cachelink, 'w');
   fwrite($fp, ob_get_contents());
   fclose($fp);
   ob_end_flush();

Открываем файл на запись и записываем туда все, что сохранилось во временном хранилище. После этого закрываем файл. Очищаем временное хранилище данных и выключаем буферизацию.

Вот и все. Весь код. Как видите, нечего сложного здесь нет. Я не являюсь профессиональным программистом и то смог применить совокупность нескольких технических решений, которые когда-то нашел в Интернете и объединить их в один узконаправленный блок.

С помощь этого блока я ускорил время загрузки страницы в среднем на 24%. Проверял я с помощью сервиса http://webo.in. Если у Вас есть лучшее решение, обязательно мне напишите через форму Контакты и подробнее опишите его. Если оно действительно будет лучше моего, я опубликую его в качестве альтернативного решения.

Но пока я таких комплексных решений как у меня не видел.

В заключении скажу следующее. Данный способ отлично работает на моем сайте, и пока проблем с ним не было. Он, конечно, немного улучшен с помощью блока оптимизации страницы перед выводом, который помогает уменьшить вес страницы еще на 2 – 8%. Но в целом это рабочий скрипт, который реально увеличивает скорость загрузки сайта.

PS: Попробуйте применить его на своем сайте.



Комментарии к записи:

Добавил(а): Роман     Дата добавления: 2010-04-16

Алексей, спасибо.У меня как раз стоит проблема загрузки. Сайт получился тяжеловат. Велик процент отказов. Буду пробовать Ваш скрипт.


Добавил(а): Бог     Дата добавления: 2010-08-14

в нормальных странах используюn nginx


Добавил(а): Menwyy     Дата добавления: 2011-01-21

Хм, интересно...стоит попробовать...


Добавил(а): Malvados Dgibersant     Дата добавления: 2011-02-06

А Можно скриптик скачать! или что то готовое!


Добавил(а): Vadim     Дата добавления: 2011-05-29

Уменьшилось. Но не значительно. У меня очень долго грузится само "тело" страницы, т.е. шапка и бока быстро, а контент - долго. Написан, в принципе, сам текст. Бывает, что текст не до конца грузится или выходит за рамки таблицы. Спасибо.


Добавил(а): Владимир     Дата добавления: 2011-07-17

Доброе время суток Алексей! Спасибо за пост! Стоящий особого внимания! Желаю Вам новых творческих успехов,счастья,удачи и здоровья! Здоровье у меня! Приглашаю в гости! Примем радушно! С искреннем уважением, Владимир.



Добавить Ваш комментарий:

  

Ваш сайт (если нет оставьте пустое поле):

Введите число с картинки:

Введите число на картинке