avatar_Everybody

Как просто и быстро кэшировать сайт в несколько раз?

Автор Everybody, 2009 Апр. 21, 18:29

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Ключевые слова [SEO] phpmysqlкэширование

Everybody

В данной статье рассматривается один из самых простых способов кэширования подкачиваемых файлов, SQL запросов и других медленно создаваемых частей ваших страниц. Язык программирования: PHP

Что должно быть на главной странице ?? Правильно, там должно быть понемножку от каждого раздела сайта. И конечно Ваша страница строится автоматически, исходя из содержимого форумов, новостных лент и других разделов сайта.

Сколько SQL запросов выполняется при загрузке главной страницы ?? Сколько блоков подкачивается с других сайтов ??

Сейчас мы рассмотрим простой и эффективный способ кэширования данных такого рода.

В качестве примера рассмотрим случай импорта новостей с внешнего сервера: _https://news.novgorod.ru/ultramode.txt

Наша задача получить этот файл, обработать его и вывести его пользователю. Программа делающая это, выглядит следующим образом:
Цитировать$d=@file("https://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, если новости обновляются не чаще одного раза в два-три часа?? Правильно. Надо кэшировать.

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

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

Ниже приведен код проделывающий все это:
// считываем файл из кэша
$d=@file("/tmp/news.cache");
$fs=trim($d[1]);
// Если файл не обновлялся 3600 секунд (1 час) или файл пуст,
// то обновляем его
if (intval($d[0]) $d=@file("https://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 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 "";
print trim($msg)." (".$date.")";
}

Вот и все. Таким же образом можно кэшировать и SQL запросы. Используя этот механизм мне удалось уменьшить время создания главной страницы с 1.5 сек до 0.05 сек
Источник: codingrus.ru

Everybody

Ещё один простой способ кеширования страниц   

Сайт динамический. Часть страниц меняется редко, а хитов по ним много. Знакомая ситуация? Еще бы. Надеюсь, эта статья поможет Вам несколько ускорить загрузку таких страниц и снять лишнюю нагрузку с сервера.

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

Для начала определимся, как будет выглядеть кеш. Думаю, что самый простой (и не самый плохой) выход - это просто каталог с файлами, названными определенным образом. Имена файлов будут состоять из несколько видоизмененного query_string и прав пользователя. Из query_string мы вырезаем упоминание о сессии (у разных пользователей она разная, а страница, скорее всего, одна и та же). Права пользователя - важная вещь. Ведь, например, администратор часто видит страницу не так, как обычные пользователи. В данном фрагменте кода мы считаем, что есть глобальная переменная $user, где хранится информация о пользователе, и функция user_rights, которая возвращает права пользователя.

function make_cache_fname() {
global $user;
return cache/.
md5(preg_replace(/^(.*?)&?.session_name()..*$/si,
1,
getenv(query_string))).
..
md5(user_rights($user));
}

Теперь можем создать функцию, которая будет читать данные из кеша. Если она не найдет нужную информацию, она вернет пустую строку.

function page_from_cache() {
global $cache_hits, $cache_expirations, $timelimit;
$fname = make_cache_fname();
if ((file_exists($fname)) and
(($time_diff = (time() - filemtime($fname))) < $timelimit)) {
$fchk = fopen($fname, r);
$output = fread($fchk, filesize($fname));
fclose($fchk);
$cache_hits++;
$tm = $timelimit - $time_diff;
$cache_expirations .= ((strlen($cache_expirations) > 0) ? , : ).
((strlen($tm) > 0) ? $tm : 0);
return $output;
} // cache hit
else {
return ;
}
}

Ну и, конечно, никак нельзя обойтись без добавления в кеш. Тут все просто.

function add_to_cache($txt) {
$fname = make_cache_fname();
$fchk = fopen($fname, w);
fwrite($fchk, $txt);
fflush($fchk);
fclose($fchk);
}

Ну а теперь - используем. Объявляем три глобальные переменные - $cache_hits, $cache_expirations, $timelimit. Первая будет хранить количество страниц, взятых из кеша, вторая - список времен, через которые истекает срок хранения данных, взятых из кеша, третья хранит время, через которое кеш надо обновлять.

global $cache_hits, $cache_expirations, $timelimit;

$cache_hits = 0;
$cache_expirations = ;
$timelimit = 150;

//// use cache - begin ////
$cached_page .= page_from_cache();
if ($cached_page != ) {
$output .= $cached_page;
} // cache hit
else {
// устанавливаем значение $to_cache
add_to_cache($to_cache);
$output .= $to_cache;
} // no cache hit
//// use cache - end ////
// используем результат - $output
Где-нибудь внизу страницы можем вывести статистику:

echo cache hit(s): .$cache_hits.
(.((strlen(trim($cache_expirations)) > 0) ? $cache_expirations : 0).);

Источник: realcoding.net

Похожие темы (5)