PHP - Простое кэширование
В данной статье рассматривается один из самых простых способов кэширования подкачиваемых файлов, 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)."</a> (".$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])<time()-600 || empty($fs)) {
$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;$i<count($d);$i++) fputs($fw,trim($d[$i])."\n");
fclose($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)."</a> (".$date.")";
}
Вот и все. Таким же образом можно кэшировать и SQL запросы. Используя этот механизм мне удалось уменьшить время создания главной страницы с 1.5 сек до 0.05 сек
Оставить комментарий
Оставлять комментарии могут только зарегистрированные пользователи.
Если вы не являетесь зарегистрированным пользователем, то вам необходимо зарегистрироваться. Регистрация бесплатна. Если вы уже зарегистрированы на CodeNet, то вам необходимо ввести логин и пароль в верхней (Alt-U) части страницы.
