Кэшировщик

Обсуждение CMS Made Simple в России.

Moderators: iturbay, wdwp

Post Reply
von-hamster
Power Poster
Power Poster
Posts: 339
Joined: Thu Nov 01, 2007 3:11 pm

Кэшировщик

Post by von-hamster »

Выкладываю свой кэшировщик.

Как установить:
1. копируем файл RZ_cache.php в корень сайта
2. Правим в нем: var $ttl; - время жизни кэша в секундах, если нужно
3. Правим $this->cache_dir = dirname(__FILE__) . '/tmp/cache/rzc_'; - это путь к папке и начало названия файла кэша. По умолчанию - в папке с кэшами админки, что позволяет очищать кэш из админки.
4. вставляем в index.php:

Code: Select all

#$Id: index.php 5266 2008-11-13 12:15:37Z alby $

// cache_hack (первая часть в самом начале)
require_once('RZ_cache.php');

$RZ_c = new RZ_cache($_SERVER["REQUEST_URI"]);

// очистка всего кэша по гету
if (isset($_GET['clear_all'])) {
	$RZ_c->clear_all();
}

if (isset($_GET['clear_this'])) {
	$RZ_c->clear();
}

if (isset($_GET['clear_sub'])) {
	$RZ_c->clear(true);
}

$RZ_c->echo_cache();
// cache_hack

$orig_memory = (function_exists('memory_get_usage')?memory_get_usage():0);

......................................

if (isset($pageinfo) && $pageinfo !== FALSE)
{
// cache_hack (вторая часть)
	$RZ_c->need_cache = $RZ_c->need_cache && $pageinfo->cachable;
// cache_hack
	$gCms->variables['pageinfo'] =& $pageinfo;

......................................

echo $html;

// cache_hack (третья часть)
$RZ_c->write_cache(ob_get_contents());
// cache_hack

@ob_flush();

......................................
И все  :) ...

Как работает:
1. Когда открывается страничка, проверяется наличие для нее кэша, если есть, и он не устарел - то отображается кэш.
2. Если нет кэша, или он устарел, после того, как страница была открыта, если у нее стоит в админке, что она кэшируется, то создается в папке файл с контентом.
3. Если есть GET или POST - странички не кэшируются, и кэш игнорируется (безопасно для форм)
4. Можно принудительно сбросить кэш:
    - в админке (Администрирование сайта -> Общие настройки -> Очистить кэш) - весь
    - если добавить к пути ?clear_all (например, example.ru/?clear_all), то очистится весь кэш
    - если добавить к пути ?clear_this (например, example.ru/foo/?clear_this), то очистится кэш только этой страницы
    - если добавить к пути ?clear_sub (например, example.ru/bar/?clear_sub), то очистится кэш этой страницы и всех вложеных.

Ограничения:
1. Кэш автоматом не сбрасывается, после редактирования (при необходимости можно самому прописать в ивенты, используя $RZ_c глобальную переменную)
2. Если на странице есть ротирующиеся элементы (например, баннеры, или случайные афоризмы (и т.п.)) - это не будет работать (как вариант - использовать php вставки).
3. Код не идеален - писал быстро, мало комментариев, многое я бы переделал, но ща нет времени. :) Поэтому коментарии и предложения приветствуются. А также здоровая критика.
von-hamster
Power Poster
Power Poster
Posts: 339
Joined: Thu Nov 01, 2007 3:11 pm

Re: Кэшировщик

Post by von-hamster »

Файл
Attachments

[The extension txt has been deactivated and can no longer be displayed.]

Sonya

Re: Кэшировщик

Post by Sonya »

von-hamster wrote: С 5 попытки удалось создать тему :)
Это akismet http://forum.cmsmadesimple.org/index.ph ... 922.0.html Достали соотечественники :)

По теме. У меня стоит похожий самописный кэшировшик. Но дело в том, что у меня на всех страницах форма логина для пользователя в шапке, которая преображается в ссылку на личный раздел после логина. Я кэширую сайт полностью для незалогиненных, но вот как это сделать для залогиненных ума не приложу. По идее страница выглядит также, только вот форма в шапке отличается. Есть идеи?  :-\
von-hamster
Power Poster
Power Poster
Posts: 339
Joined: Thu Nov 01, 2007 3:11 pm

Re: Кэшировщик

Post by von-hamster »

1. php вставкой (сессии - то остаются - не зависимо от того - из кэша страница или нет, причем), в этом случае, в моем варианте нужно заменить: echo file_get_contents($this->file_name); на include($this->file_name);

2. Куки (сессии) и яваскрипт...
3. Опять-же в моем варианте: $this->cache_dir = dirname(__FILE__) . '/tmp/cache/rzc_'; заменить на что-то типа:

Code: Select all

$this->cache_dir = dirname(__FILE__) . '/tmp/cache/rzc_'
if ($_SESSION['is_auth_user']) {
    $this->cache_dir .= 'auth_' . $_SESSION['user_id'] . '_';
}
Общий смысл - для незалогиненых - общий кэш, для каждого залогиненого - свой...
Sonya

Re: Кэшировщик

Post by Sonya »

von-hamster wrote: Общий смысл - для незалогиненых - общий кэш, для каждого залогиненого - свой...
Идея понятна. На проекте около 4000 залогиненных пользователей в день, нужно ли кэш на папки разбивать при таком количестве, не знаешь? Я слышала, что линукс таких больших каталогов не любит или без разницы?
von-hamster
Power Poster
Power Poster
Posts: 339
Joined: Thu Nov 01, 2007 3:11 pm

Re: Кэшировщик

Post by von-hamster »

Лучше разбить, но чистить будет сложней :-)

Про линукс тоже слышал, но толком не разбирался - сказать не могу... Единственное - что он не нелюбит, а просто начинает подтормаживать при обращении, и это касается определенной файловой системы (какой - нужно уточнить), как я понял...
ZYV
Language Partners
Language Partners
Posts: 868
Joined: Tue Nov 15, 2005 9:08 pm

Re: Кэшировщик

Post by ZYV »

1) Лишнюю тему удалил, ОК?
2) Не очень понял в чем смысл, в чем отличие от стандартного.
3) А я вот слышал в Москве инопланетяне высадились. У распространителей таких слухов полный гэрбэдж в голове. Могу видеть две перворичины, из-за которых слухи могли поползи.

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

б) У некоторых FS есть ограничения на количество файлов в папке, например FAT32. ext2/3 это не касается, насколько я знаю http://en.wikipedia.org/wiki/Comparison ... ems#Limits

Недавно надо было нагенерить папки по 20 000 мелких файлов для рассчетов. Под Linux генерилось всё на порядок быстрее :) единственное, что замедляется - это скорость перечисления всех файлов директории, но если имя файла известно то никаких проблем нет.
unsigned double ZYV;
von-hamster
Power Poster
Power Poster
Posts: 339
Joined: Thu Nov 01, 2007 3:11 pm

Re: Кэшировщик

Post by von-hamster »

ZYV wrote: 2) Не очень понял в чем смысл, в чем отличие от стандартного.
Мой кэшировщик (если речь про него), если есть кэш - не грузит лишнего - тоесть просто проходит несколько проверок и отображается фактически статическая страница, даже не подключается к БД. Стандартный, как я понял, делает это после подключения всех классов и модулей. Плюс как такового полного кэширования динамических страниц я не увидел. У меня любая страница, которая проходит через index.php, если нужно - кэшируется...
Post Reply

Return to “Russian - русский”