Главная » Полезные статьи » Язык 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').')';
Источник: internet-technologies.ru
Вы можете оставить комментарий, или обратную ссылку на Ваш сайт.

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

Похожие статьи