Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Последние темы форума

Показать новые сообщения »

Почтовая рассылка

Подписчиков: 11642
Последний выпуск: 19.06.2015

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

(c) Mikhail Krivyy
19 августа 1999 года 

В данной статье рассматривается один из самых простых способов кэширования подкачиваемых файлов, 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, если новости обновляются не чаще одного раза в два-три часа?? Правильно. Надо кэшировать.

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

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

  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 сек

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог