Создайте таймированный кеш в Drupal - PullRequest
2 голосов
/ 28 января 2011

Я ищу более подробную информацию о том, как я могу получить следующее поведение кэширования в Drupal 7.

Мне нужен блок, который отображает информацию, которую я извлекаю из внешней службы. Поскольку блок отображается для многих пользователей, я не хочу постоянно запрашивать данные из этого сервиса, а вместо этого кэширую результат. Однако эти данные относительно часто меняются, поэтому я хотел бы получать последние данные каждые 5 или 10 минут, а затем снова их кэшировать.

Кто-нибудь знает, как добиться такого поведения кэширования, не написав слишком много кода самостоятельно? Я также не нашел много хорошей документации о том, как использовать кеширование в Drupal (7), поэтому любые указания на это также приветствуются.

Ответы [ 3 ]

3 голосов
/ 01 февраля 2011

Имейте в виду, что cache_get () на самом деле не проверяет, истек ли срок действия элемента. Так что вам нужно использовать:

if (($cache = cache_get('your_cache_key')) && $cache->expire >= REQUEST_TIME) {
  return $cache->data;
}

Также убедитесь, что в D7 используется константа REQUEST_TIME, а не time ().

2 голосов
/ 28 января 2011

Функции cache_set () и cache_get () - то, что вы ищете. cache_set () имеет аргумент истечения срока действия.

Вы можете использовать их в основном так:

<?php
if ($cached_data = cache_get('your_cache_key')) {
  // Return from cache.
  return $cached_data->data;
}

// No or outdated cache entry, refresh data.
$data = _your_module_get_data_from_external_service();
// Save data in cache with 5min expiration time.
cache_set('your_cache_key', $data, 'cache', time() + 60 * 5);
return $data;
?>

Примечание. Вы также можете использовать другую корзину кеша (см. Ссылки на документацию), но вам необходимо создать соответствующую таблицу кеша как часть вашей схемы.

0 голосов
/ 09 января 2014

Я думаю, это должно быть $cache->expire, а не истекает.Мне не повезло с этим примером, если я устанавливаю REQUEST_TIME + 300 в cache_set(), поскольку $cache->expires всегда будет меньше REQUEST_TIME.Это работает для меня:

if (($cache = cache_get('your_cache_key', 'cache')) && (REQUEST_TIME < $cache->expire)) {
  return $cache->data;
}
...