Пример кеширования блоков на примере блока статистики на drupal.ru
Прислано: axel
сб, 02/12/2006 - 00:37
Вот такой код используется для блока статистики сайта на drupal.ru:
<?php
// здесь происходит проверка на наличие в кеше фильтров данных с идентификаторов 'site-stats'
// если они найдены, то происходит вывод из кеша, вместо обработки блока заново
if ($cached = cache_get("site-stats", 'cache_filter')) {
$out = $cached->data;
}
else {
// здесь код нашего блока, вывод пишется в переменную $out
$nodes = db_fetch_object(db_query("SELECT count(*) AS num FROM {node} WHERE status > 0"));
$comments = db_fetch_object(db_query("SELECT count(*) AS num FROM {comments} WHERE status = 0"));
$users = db_fetch_object(db_query("SELECT count(*) AS num FROM {users} WHERE status > 0"));
$out = "Опубликовано документов: <strong>$nodes->num</strong><br />";
$out .= "Комментариев к ним: <strong>$comments->num</strong><br />";
$out .= "Зарегистрировано пользователей: <strong>$users->num</strong><br />";
// эта строка записывает данные в кэш, с идентификатором 'site-stats', в таблицу для кеширования фильтров, на время 20 мин.
cache_set("site-stats", 'cache_filter', $out, time() + (60 * 20 ));
}
// выводим блок
echo $out;
?>Запросы тривиальные, однако обращу внимание на использование кеширования с помощью функций cache_set и cache_get. В данном случае кеширование излишне, поскольку COUNT(*) в MySQL вызванный без дополнительных условий выполняется очень быстро и выборка из кэша с поиском по строковому идентификатору врядли будет быстрей даже трёх таких COUNT. Поэтому реальный блок сейчас выглядит проще и обращения к COUNT(*) происходят каждый раз при отображении блока. Однако, в блоки может захотеться запихнуть более сложные и длительные по времени запросы, вот тогда кеширование будет очень полезным. Время кеширования варьируется в зависимости от желаемой динамики отображения информации. Можно использовать вместо timestamp константу CACHE_PERMANENT для перманетного хранения данных (до ближайшей полной очистки кеша).
Общий формат вызова функции cache_set:
<?php function cache_set($cid, $table = 'cache', $data, $expire = CACHE_PERMANENT, $headers = NULL) ?>
Для 4.7 не было разделения таблиц кеширования на кеш фильтров и страниц, это появилось в 5.0. Поэтому теперь надо указывать в какой из кешей мы сохраняем данные. Возможные значения аргумента $table — cache_menu, cache_filter, cache_page, cache — последний является общим кешем используемым по-умолчанию. А для 4.7 параметры функции те же, только не надо указывать $table.
Полное описание cache_set: http://api.drupal.org/api/HEAD/function/cache_set
Отличия вызова cache_set для 4.7: http://api.drupal.org/api/4.7/function/cache_set
Используйте кеш и ваши сайты будут чувствовать себя прекрасно! :)
- axel's blog
- Для комментирования войдите или зарегистрируйтесь
Спасибо, Axel!
Уже знаю где надо использовать :)
- Для комментирования войдите или зарегистрируйтесь
Блин, когда уже книга будет... :) Ждем с нетерпением :)
- Для комментирования войдите или зарегистрируйтесь
Саша, поправь пример.
Вариант с комментами работает через раз.
Посмотри в моём модуле статистики, как это делаю я.
В моём случае работает стопроцентно : )
- Для комментирования войдите или зарегистрируйтесь
а если мне нужен пересчёт количества материалов для одного типа, например blog?
что изменить в коде? и стоит ли в данном сучае использовать кэш?
- Для комментирования войдите или зарегистрируйтесь
Пригодилось! Большое Вам спасибо!
- Для комментирования войдите или зарегистрируйтесь




Комментарии