#php #drupal #drupal-7
#php #drupal #drupal-7
Вопрос:
У меня довольно дорогой вызов сервера, который мне нужно кэшировать в течение 30 секунд. Однако, похоже, я не могу добиться истечения срока действия кэша.
В приведенном ниже коде после первого кэширования он никогда не перейдет за пределы $return-> cache_data, даже по истечении времени() 30 секунд.
Обратите внимание, я даже могу напечатать $cache-> expire, и он определенно установлен на время, прошедшее 30 секунд назад, и никогда не обновляется.
Я много раз вручную очищал кэш, чтобы убедиться, что получаю те же результаты.
Что-нибудь в этом не так?
function mymodule_get_something($id) {
// set the unique cache id
$cid = 'id-'. $id;
// return data if there's an un-expired cache entry
// *** $cache ALWAYS gets populated with my expired data
if ($cache = cache_get($cid, 'cache_mymodule')) {
return $cache->data;
}
// set my super expensive data call here
$something = array('Double Decker Taco', 'Burrito Supreme');
// set the cache to expire in 30 seconds
cache_set($cid, $something, 'cache_mymodule', time() 30);
// return my data
return $something;
}
Ответ №1:
В вашем коде как таковом нет ничего плохого, я думаю, проблема в том, как cache_set
ведет себя. Со страницы docs передается временная метка UNIX:
Указывает, что элемент должен храниться по крайней мере до заданного времени, после чего он ведет себя как CACHE_TEMPORARY.
CACHE_TEMPORARY
ведет себя следующим образом:
Указывает, что элемент должен быть удален при следующей общей очистке кэша.
Мое лучшее предположение заключается в том, что, поскольку вы неявно принудительно выполняете эту общую очистку кэша (используя cache_clear_all()
), объект кэша сохранится.
Я думаю, что простым способом обойти это было бы просто вручную проверить время истечения срока действия после проверки вашего кэша и пропустить его до переустановки этого объекта кэша, если срок его действия истек:
if ($cache = cache_get($cid, 'cache_mymodule')) {
if ($cache->expire > REQUEST_TIME) {
return $cache->data;
}
}
Комментарии:
1. Хороший подход. 1… РЕДАКТИРОВАТЬ: Только что заметил, что это был Clive. Конечно, это был хороший подход.
2. Привет, Клайв, «следующая общая очистка кэша», что это? drush cc all удаляет как CACHE_TEMPORARY, так и CACHE_PERMANENT. Когда произойдет общий сброс кэша, есть идеи?