Пример кеширования блоков на примере блока статистики на 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'$outtime() + (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

Используйте кеш и ваши сайты будут чувствовать себя прекрасно! :)

Комментарии


Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Применить"
Опубликовано Dan в сб, 02/12/2006 - 10:06.

Спасибо, Axel!
Уже знаю где надо использовать :)


Опубликовано marazmus в вт, 08/05/2007 - 17:40.

Блин, когда уже книга будет... :) Ждем с нетерпением :)


Опубликовано SadhooKlay (гостевой логин) в ср, 09/05/2007 - 21:26.

Саша, поправь пример.
Вариант с комментами работает через раз.

Посмотри в моём модуле статистики, как это делаю я.
В моём случае работает стопроцентно : )


Опубликовано clubwave.ru в ср, 26/09/2007 - 20:41.

а если мне нужен пересчёт количества материалов для одного типа, например blog?

что изменить в коде? и стоит ли в данном сучае использовать кэш?


Опубликовано josephmccormick в пт, 13/08/2010 - 16:03.

Пригодилось! Большое Вам спасибо!


Новое на сайте