Что такое кэширование?

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

А можно просто один раз сформировать страницу и записать ее в файл. И при каждом запросе выдавать результат из файла, а не делать все заново. Это и есть кэширование. Оно позволяет снизить нагрузку на сервер и на базу данных.

Единственная проблема — это устаревание кэша. Допустим, что страница изменились, а кэш страницы — еще нет, и пользователю будет выдаваться старая версия. Способы борьбы:

  1. Выставлять более-менее приемлимое время устаревания кэша. Например, через 10 минут страница устаревает и кэш генерится заново.
  2. Сделать в административной части сайта кнопку «очистить кэш». В некоторых CMS вообще нет кнопки «очистить кэш», вместо нее есть кнопка «перегенерить сайт целиком». Нажимаем на эту кнопку — и весь сайт генерится в статичные файлы, то есть, фактически, в кэш.
  3. «Перегенерить сайт целиком» — ресурсоемкая операция. Гораздо лучше при редактировании страницы удалять кэш только той страницы, которую мы изменили. Но тут есть сложность: часто изменение одной страницы затрагивает и несколько других. Главное — понять, каких именно и очистить кэш у них тоже.

А теперь посмотрим, как мы можем применить полученные знания на практике. В начало скрипта, готорый генерит страницы нашего сайта поместим такой код:

<?php
// раздел настроек, которые вы можете менять
$cachedir = $_SERVER['DOCUMENT_ROOT'].'/cache/';
$cachetime = 3600; //время жизни кэша (1 час)

$thispage = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
$cachelink = $cachedir.md5($thispage).".html";
if (file_exists($cachelink)) {
    $cachelink_time = filemtime($cachelink);
    // если кэш еще не устарел, читаем страницу из файла и отдаем браузеру
    if ((time() - $cachetime) < $cachelink_time) {
        readfile($cachelink);
        die();
    }
}
ob_start();
?>

А в конце скрипта добавим такие строчки

<?php
$fp = fopen($cachelink, 'w');
fwrite($fp, ob_get_contents());
fclose($fp);
ob_end_flush();
?>

Вот, собственно, и все. Все ваши страницы будут кэшироваться на 3600 секунд. Кэш страниц будет сохранен в папке cache.

Функции, которые мы использовали:

void ob_start()
Эта функция включает буферизацию вывода. Если буферизация вывода активна, никакой вывод скрипта не высылается (кроме headers); вывод сохраняется во внутреннем буфере. Содержимое этого внутреннего буфера может быть скопировано в строковую переменную с использованием ob_get_contents(). Для вывода содержимого этого внутреннего буфера используйте ob_end_flush(). Альтернативно ob_end_clean() втихую отбрасывает содержимое буфера.

string ob_get_contents()
Возвращает содержимое буфера вывода или FALSE, если буферизация вывода неактивна.

void ob_end_flush()
Эта функция отправляет содержимое буфера вывода (если оно имеется) и выключает буферизацию вывода. Если вы хотите в дальнейшем обработать содержимое буфера, вы должны вызвать ob_get_contents() до ob_end_flush(), так как содержимое буфера выбрасывается после вызова ob_end_flush().

Ссылки по теме:

Оставьте свой отзыв