В данной статье рассматривается один из самых простых способов кэширования
подкачиваемых файлов, SQL запросов и других медленно создаваемых частей ваших
страниц. Язык программирования: PHP
Что должно быть на главной странице ??
Правильно, там должно быть понемножку от каждого раздела сайта. И конечно Ваша
страница строится автоматически, исходя из содержимого форумов, новостных лент и
других разделов сайта.
Сколько SQL запросов выполняется при загрузке главной страницы ?? Сколько
блоков подкачивается с других сайтов ??
Сейчас мы рассмотрим простой и эффективный способ кэширования данных такого
рода.
В качестве примера рассмотрим случай импорта новостей с внешнего сервера: http://news.novgorod.ru/ultramode.txt
Наша задача получить этот файл, обработать его и вывести его пользователю.
Программа делающая это, выглядит следующим образом:
<?
$d=@file("http://news.novgorod.ru/ultramode.txt");
for
($i=0;$i<11;$i++)
{
$msg=$d[2+$i*8];
$url=$d[3+$i*8];
$date=$d[4+$i*8];
print "<a
href='http://news.novgorod.ru".trim($url)."'>";
print trim($msg)."
(".$date.")";
}
?>
При каждой загрузке нашей страницы происходит
обращение к внешнему серверу news.novgorod.ru, оттуда по протоколу HTTP
скачивается файл ultramode.txt. А теперь представим ситуацию, что сервер
находится на другом конце планеты и соединение, а тем более передача файла
занимает достаточно больше время. Или более того, сервер может быть временно
недоступен.
Вывод. Зачем каждый раз подгружать файл ultamode.txt, если новости
обновляются не чаще одного раза в два-три часа?? Правильно. Надо кэшировать.
А делать мы это будем очень просто. Как вы могли заметить, в первой строке
файла хранится комментарий. Комментарий нам не нужен и на его месте можно
замечательно разместить дату последнего обновления файла.
Алгоритм работы следующий:
Считываем кэшированную версию.
Если кэшированная версия устарела, то на
ее место считываем файл http://news.novgorod.ru/ultramode.txt,
заменяем первую строку на текущее время и сохраняем в кэш.
Оформляем и
выводим данные пользователю.
Ниже приведен код проделывающий все это:
<?
// считываем файл из кэша
$d=@file("/tmp/news.cache");
$fs=trim($d[1]);
//
Если файл не обновлялся 3600 секунд (1 час) или файл пуст,
// то обновляем
его
if (intval($d[0])$d=@file("http://news.novgorod.ru/ultramode.txt");
$fs=trim($d[1]);
//
Сохраняем новую версю в кэше
if (!empty($fs))
{
$fw=fopen("/tmp/news.cache","wt");
flock($fw, LOCK_EX);
// В первую
строку запишем текущее время
fputs($fw,time()."n");
// Сохраним остальные
строки
for ($i=1;$ifclose($fw);
}
// Если, почему-то, файл не был
скачан,
// то воспользуемся кэшированной версией
else $d=@file("/tmp/news.cache");
}
//
Вывод данных
for ($i=0;$i<11;$i++)
{
$msg=$d[2+$i*8];
$url=$d[3+$i*8];
$date=$d[4+$i*8];
print "<a
href='http://news.novgorod.ru".trim($url)."'>";
print trim($msg)."
(".$date.")";
}
?>
Вот и все. Таким же образом можно кэшировать и
SQL запросы. Используя этот механизм мне удалось уменьшить время создания
главной страницы с 1.5 сек до 0.05 сек.