2011-01-28 2 views
1

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

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

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

ответ

3

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

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

<?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; 
?> 

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

2

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

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

Кроме того, убедитесь, чтобы использовать request_time постоянного, а не время() в D7.

+0

Благодарим за информацию. Я нашел поток, где он был исправлен для D7, видимо, но просто подтвердил, что это еще не так в моей установленной версии. Хорошо знать. – Frank

+0

Фрэнк, любое изменение отдачи в виде нитки? Какая версия D7? – miguelr

+0

Да, по-прежнему существует исправление, исправляющее это поведение в методе/рабочем процессе cache_get() ядра, но оно еще не зафиксировано и исправлено в ядре Drupal 7. –

0

Я думаю, что это должно быть $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; 
} 
Смежные вопросы