PHP

Простой способ кеширования страниц

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

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

Для начала определимся, как будет выглядеть кеш. Думаю, что самый простой (и не самый плохой) выход - это просто каталог с файлами, названными определенным образом. Имена файлов будут состоять из несколько видоизмененного 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").")";
Теги:
кеширование
Добавлено: 29 Мая 2018 20:55:55 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...