Page 1 of 1

Кэшировщик

Posted: Fri Dec 12, 2008 8:15 am
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. Код не идеален - писал быстро, мало комментариев, многое я бы переделал, но ща нет времени. :) Поэтому коментарии и предложения приветствуются. А также здоровая критика.

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

Posted: Fri Dec 12, 2008 8:17 am
by von-hamster
Файл

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

Posted: Fri Dec 12, 2008 8:22 am
by Sonya
von-hamster wrote: С 5 попытки удалось создать тему :)
Это akismet http://forum.cmsmadesimple.org/index.ph ... 922.0.html Достали соотечественники :)

По теме. У меня стоит похожий самописный кэшировшик. Но дело в том, что у меня на всех страницах форма логина для пользователя в шапке, которая преображается в ссылку на личный раздел после логина. Я кэширую сайт полностью для незалогиненных, но вот как это сделать для залогиненных ума не приложу. По идее страница выглядит также, только вот форма в шапке отличается. Есть идеи?  :-\

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

Posted: Fri Dec 12, 2008 8:54 am
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'] . '_';
}
Общий смысл - для незалогиненых - общий кэш, для каждого залогиненого - свой...

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

Posted: Fri Dec 12, 2008 8:58 am
by Sonya
von-hamster wrote: Общий смысл - для незалогиненых - общий кэш, для каждого залогиненого - свой...
Идея понятна. На проекте около 4000 залогиненных пользователей в день, нужно ли кэш на папки разбивать при таком количестве, не знаешь? Я слышала, что линукс таких больших каталогов не любит или без разницы?

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

Posted: Fri Dec 12, 2008 9:11 am
by von-hamster
Лучше разбить, но чистить будет сложней :-)

Про линукс тоже слышал, но толком не разбирался - сказать не могу... Единственное - что он не нелюбит, а просто начинает подтормаживать при обращении, и это касается определенной файловой системы (какой - нужно уточнить), как я понял...

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

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

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

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

Недавно надо было нагенерить папки по 20 000 мелких файлов для рассчетов. Под Linux генерилось всё на порядок быстрее :) единственное, что замедляется - это скорость перечисления всех файлов директории, но если имя файла известно то никаких проблем нет.

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

Posted: Mon Dec 15, 2008 6:36 am
by von-hamster
ZYV wrote: 2) Не очень понял в чем смысл, в чем отличие от стандартного.
Мой кэшировщик (если речь про него), если есть кэш - не грузит лишнего - тоесть просто проходит несколько проверок и отображается фактически статическая страница, даже не подключается к БД. Стандартный, как я понял, делает это после подключения всех классов и модулей. Плюс как такового полного кэширования динамических страниц я не увидел. У меня любая страница, которая проходит через index.php, если нужно - кэшируется...