Простое кэширование страниц

Поиск на php

Простое кэширование страниц. Для чайников. На PHP.

Кэширование — замечательная вещь. Часто (теперь — почти всегда) страницы на сайтах генерятся динамически. Это теперь модно. Однако же — в реальности — почти всегда страница собирается заново гораздо чаще, чем она изменяется. Грубо говоря, мы опубликовали новый документ, и при каждом обращении к нему он заново считывается, скажем, из базы данных, заново прогоняется через шаблон и прочее и прочее. Мы снова и снова делаем одну и ту же работу.

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

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

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

1. Выставлять более-менее приемлимое время устаревания кэша. Например, через 10 минут страница устаревает и кэш генерится заново. Минусы: возможна ситуация, когда пользователю 9 минут будет показываться старая страница.

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. Это будет использоваться, как идентификатор страницы. Например, для УРЛа technology/php/caching 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 секунды. Выигрыш процессорного времени налицо.

Разумеется, я описал только общий принцип, у меня сделано несколько по-другому.



Опубликовал admin
10 Сен, Среда 2003г.



Программирование для чайников.