Drupal → Кэширование данных в собственную таблицу

17.11.2010

В друпале по умолчанию кэш разделён на несколько таблиц, это — cache, cache_block, cache_filter, cache_form, cache_menu, cache_page и cache_update. Из названий понятно для чего они предназначены. Для того, чтобы хранить данные в собственной таблице и при этом пользоваться функциями cache_set() / cache_get(), достаточно в .install файле вашего модуля реализовать соответствующим образом хук hook_schema():

/**
 * Implements hook_schema().
 */
function mymodule_schema() {
  $schema['cache_mycache'] = drupal_get_schema_unprocessed('system', 'cache');
  $schema['cache_mycache']['description'] = 'Кэш-таблица под мои данные';
  return $schema;
}
<!--break-->
/**
 * Implements hook_install().
 * Только для Drupal 6
 */
function mymodule_install() {
  drupal_install_schema('mymodule');
}

/**
 * Implements hook_uninstall().
 * Только для Drupal 6
 */
function mymodule_uninstall() {
  drupal_uninstall_schema('mymodule');
}

Плюс, реализовать в основном файле модуля хук hook_flush_caches(), для включения механизма очистки таблицы от старых данных:

/**
 * Implements hook_flush_caches().
 */
function mymodule_flush_caches() {
  return array('cache_mycache');
}

После этого в коде можно писать:

// записываем в кэш на 1 день
cache_set('some-cid', 'some-data', 'cache_mycache', time() + 60*60*24);

// или записываем в кэш до первой очистки
cache_set('some-cid', 'some-data', 'cache_mycache');

// читаем из кэша
$cache = cache_get('some-cid', 'cache_mycache');
Написанное актуально для
Drupal 6, Drupal 7
Похожие записи

Комментарии

Было бы круто отдельный пост про кэширование в Друпале для нубов. Чтобы на пальцах :)

А так - спасибо!

Vydrin_AP
16.08.2011, 11:28

День добрый! Пишу модуль и планирую в нем встроить свое кэширование (очень уж специфичная отдача контента будет). Посоветуйте пожалуйста как лучше хранить кэш? Как описано выше или же лучше по примеру Boost'а хранить кэшированные страницы в файлах и по hook_flush_caches чистить их?
Я придерживаюсь второго варианта, т.к. он обеспечивает минимальное количество обращений к БД. Плюс планируется разделение на два сервера, один под БД и фронтенд, второй под статику и кэшированные страницы.
Очень интересно услышать ваше мнение. Спасибо!

делайте тесты, смотрите что быстрее

Добавить комментарий