» Форма входа

»Мoy-weB ver.4.1

» Статистика

Главная » 2008 » Сентябрь » 20 » PHP - Простое кэширование

PHP - Простое кэширование
20.Сен.2008 | 20:58:17

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
"";
        print
trim($msg)."
("
.$date.")";
        }
?>

При каждой загрузке нашей страницы
происходит обращение к внешнему серверу news.novgorod.ru, оттуда по
протоколу HTTP скачивается файл ultramode.txt. А теперь представим
ситуацию, что сервер находится на другом конце планеты и соединение, а
тем более передача файла занимает достаточно больше время. Или более
того, сервер может быть временно недоступен.

Вывод. Зачем каждый
раз подгружать файл ultamode.txt, если новости обновляются не чаще
одного раза в два-три часа?? Правильно. Надо кэшировать.

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

Алгоритм работы следующий:

1. Считываем кэшированную версию

2. Если кэшированная версия устарела, то на ее место считываем файл
http://news.novgorod.ru/ultramode.txt, заменяем первую строку на
текущее время и сохраняем в кэш.
3. Оформляем и выводим данные пользователю.

Ниже приведен код проделывающий все это:


<?
// считываем файл из кэша
$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 сек
Категория: Статьй и уроки | Просмотров: 528 | Добавил: CorsaR
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]