Срок действия элемента временного кэша Drupal 7 не истечет - PullRequest
6 голосов
/ 14 ноября 2011

У меня довольно дорогой серверный вызов, который мне нужно кэшировать в течение 30 секунд.Однако, похоже, что я не могу получить срок действия кэша.

В приведенном ниже коде после первого кэширования он никогда не пройдет $ return-> cache_data, даже после time () + 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 Ответ

10 голосов
/ 14 ноября 2011

Нет ничего плохого в вашем коде как таковом, я думаю, проблема в том, как cache_set ведет себя. Со страницы документов с отметкой времени UNIX:

Указывает, что элемент должен храниться как минимум до указанного времени, после чего он ведет себя как CACHE_TEMPORARY.

CACHE_TEMPORARY ведет себя так:

Указывает, что элемент должен быть удален при следующей общей очистке кэша.

Мое лучшее предположение заключается в том, что, поскольку вы неявным образом не выполняете эту обычную очистку кэша (используя cache_clear_all()), объект кэша будет сохраняться.

Я думаю, что простым способом было бы вручную протестировать время истечения после проверки кеша и позволить ему сбросить настройки этого кеша, если срок его действия истек:

if ($cache = cache_get($cid, 'cache_mymodule')) {
  if ($cache->expire > REQUEST_TIME) {
    return $cache->data;
  }
}
...