Файловое кэширование страниц сайта
Самый простой и доступный способ кэширования – это кэширование на файлах
Например облако тегов, которое генерируется за 0.08 сек. Это очень много для маленького сайта визитки, особенно если учитывать, то вся страница генерируется за 0.10 секунд.
Фактически 90% уходит на генерацию облака, которое обновляется раз в несколько суток (пишу посты я не каждый день).
Вот его мы и будем кэшировать:
$filemtime = filemtime($_SERVER['DOCUMENT_ROOT'].'/cache/tags.txt'); if ((time() - $filemtime) > 60*60*24) { $Cloud = new SimpleTags(); $fp = fopen($_SERVER['DOCUMENT_ROOT'].'/cache/tags.txt', 'w'); flock($fp, LOCK_EX); fwrite($fp, $Cloud->extendedTagCloud()); flock($fp, LOCK_UN); fclose($fp); } include($_SERVER['DOCUMENT_ROOT'].'/cache/tags.txt');
Файл, в котором хранится кэш
http://site.ru/cache/tags.txt
Узнаем время последнего изменения файла в формате unix_timestamp
filemtime($_SERVER['DOCUMENT_ROOT'].'/cache/tags.txt')
Если прошло больше суток (в секундах) с последнего изменения кэша
(time() - $filemtime) > 60*60*24
Генерируем облако
$Cloud = new SimpleTags(); $Cloud->extendedTagCloud()
Блокируем доступ к файлу в момент записи
flock($fp, LOCK_EX); fwrite($fp, …); flock($fp, LOCK_UN);
Берем данные из кэша
include($_SERVER['DOCUMENT_ROOT'].'/cache/tags.txt');
Теперь кусок кода с кэшированием выполняется за 0.0005 сек, а вся страница генерируется за 0.02 секунды вместо 0.33 сек.
Еще пример кэширования:
Например это может быть многоуровневое меню выводимое из базы, последние посты в блоге или комментарии или любая другая информация. Кэшируя этот вывод в файл мы избавляемся от ненужных запросов в базу.
Часто скрипт дает ускорение в ого-го раз, привожу сразу листинг самого класса:
<? class cache { var $cache; var $cacheurl; var $modif; var $its_all_cache_menu_ok; var $fullurl; function CacheStart($urlglobal,$timecache,$path) { $this->cacheurl="cache_".md5($urlglobal); $this->fullurl=$path.$this->cacheurl; $this->modif=time()-@filemtime ($this->fullurl); if ($this->modif<$timecache){ include ($this->fullurl); $this->its_all_cache_menu_ok=1; } } function CacheInit() { ob_start(); } function CacheClean() { ob_end_clean(); } function CacheGet () { $this->cache = ob_get_contents(); return $this->cache; } function CacheInputAndWrite() { echo $this->cache; $fp = @fopen ($this->fullurl, "w"); @fwrite ($fp, $this->cache); @fclose ($fp); } } ?>
А использовать класс очень просто, в том месте где вы подгружаете файл или модуль:
Вместо
<?php include 'sidebar.php'; ?>
Пишем
<?php $classcache = new cache(); // Кэширование боковой части с категориями $classcache->CacheStart($_SERVER['REQUEST_URI'], 3600, rtrim($_SERVER['DOCUMENT_ROOT'],'/')."/cache/"); if ($classcache->its_all_cache_menu_ok!=1) { $classcache->CacheInit(); include 'sidebar.php'; $classcache->CacheGet(); $classcache->CacheClean(); $classcache->CacheInputAndWrite(); } unset($classcache); ?>
В функцию CacheStart мы передаем три параметра:
Первый - текущая страница, или любой другой идентификатор уникальный для данного кэша. Например можно брать не только текущий URL, но и например текущий раздел. Если этот блок для всех страниц одинаковый, то просто поставьте название раздела, например "main_photo_frame".
Второй - время в секундах, на которое мы кэшируем блок. 3600 секунд это час.
Третий - Путь, куда мы будем складывать кэш вывода скрипта. Не забудьте поставить права на папку 777.
Скрипт работает просто. Сначала скрипт проверяет наличие файла и если он есть, сверяет время его создания. Если он устарел, или файла кэша нет, то буферизирует вывод и записывает его в файл кэша.
Надеюсь этот класс окажется для вас полезным.