Кэширование страниц на сайтах это неотъемлемый атрибут снижения нагрузки на сервер и сокращения времени загрузки самой страницы.
Часто страницы на сайтах генерируются динамически.
Это теперь модно. Однако, в реальности, почти всегда страница собирается заново гораздо чаще, чем она изменяется.
Грубо говоря, мы опубликовали новый документ, и при каждом обращении к нему он заново считывается, скажем, из базы данных, заново прогоняется через шаблон и т.д.
Мы каждый раз делаем одну и ту же работу.
А можно просто один раз сделать, а потом сохранить результат этой работы. И при каждом запросе выдавать готовый результат, а не делать все заново. Это и есть кэширование.
Оно позволяет, снизить нагрузку на сервер и на базу данных.
Единственная проблема — это старение кэша.
Допустим, что данные на странице изменились, а кэш страницы — еще нет, и пользователю будет выдаваться старая версия страницы.
Рассмотрим способы борьбы с этим недугом.
1. Выставлять более-менее приемлемое время старения кэша. Например, через 5 минут страница устаревает и кэш генерируется заново.
Минусы: возможна ситуация, когда пользователю 5 минут будет показываться старая страница.
2. Кнопка «очистить кэш». В некоторых системах вообще нет кнопки «очистить кэш», вместо нее есть кнопка «обновить сайт целиком». Нажимаем на эту кнопку — и весь сайт генерируется в статичные файлы, то есть, фактически, в кэш.
Минусы: поменяли одну страницу, а обновлять приходится весь сайт.
3. Очистка кэша. Очищается кэш только той страницы, которую мы изменили.
Минус: часто изменение одной страницы затрагивает несколько других страниц. Главное — понять, каких именно страниц, и очистить кэш у них тоже.
А теперь давайте разберемся, как сделать себе кэш.
Существует некая функция PHP — ob_start, она позволяет не выводить страницу в браузер, а, например, сохранить ее в переменную.
Каким образом использовать эту переменную и как создать простейший кэш на сайте – написано чуть ниже на примере.
Данный код вставляем в начало страницы:
$url=$GLOBALS['REQUEST_URI'];
$crc=md5($url);
$modif=time()-@filemtime ("cache/$crc");
if ($modif<600) {
include ("cache/$crc");
exit(); }
ob_start ();
Как это работает.
Берем адрес страницы, вычисляем из него md5.
Вычисление будет использоваться, как идентификатор страницы. Например, для URL
http://имя_сайта/php/index.php - md5 будет всегда одним и тем же.
Этим мы и воспользуемся.
Файлы кэша будут лежать в директории cache.
Смотрим, сколько секунд - filemtime, исполнилось файлу с кэш данной страницы. Если он не очень старый (меньше 600 секунд) и существует — выводим его через include.
Если нет — то включаем функцию ob_start и продолжаем дальше.
Данный код вставляем в конец страницы:
$cache = ob_get_contents();
ob_end_clean ();
echo $cache;
$fp = @fopen ("cache/$crc", "w");
@fwrite ($fp, $cache);
@fclose ($fp);
Как это работает.
Считываем содержимое буфера функцией ob_get_contents. Получаем в переменной $cache то, что должно было, выводится в браузер.
Выводим в браузер функцией echo.
Записываем содержимое буфера переменной $cache в директорию cache в файл $crc.
Все. Теперь при следующем обращении к странице с этим адресом, код находящийся в начале страницы будет смотреть, есть ли соответствующий файл в кэше и если он еще не устарел — прерывать обработку генерации страницы функцией exit, и выводить в браузер страничку из кэша.
Примерно так все и работает.
Таким образом, страница выводится из кэша примерно за 0.001–0.004 секунды. В результате мы выигрываем во времени загрузки страницы и не нагружаем сервер запросами интерпретатора РНР и генерацией страниц, а так же базу.
Понравилась Новость - щелкни на рекламе "Бегуна" - помоги сайту.