【问题标题】:Drupal 7 temporary cache item won't expireDrupal 7 临时缓存项不会过期
【发布时间】:2011-11-13 20:14:31
【问题描述】:

我有一个相当昂贵的服务器调用,我需要缓存 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;
}

【问题讨论】:

    标签: php drupal drupal-7


    【解决方案1】:

    您的代码没有任何问题,我认为问题在于cache_set 的行为方式。从docs page,传递一个 UNIX 时间戳:

    表示该项目应至少保留到给定时间,之后它的行为类似于 CACHE_TEMPORARY。

    CACHE_TEMPORARY 的行为如下:

    指示应在下一次常规缓存擦除时删除该项目。

    我最好的猜测是,因为您没有隐式强制执行常规缓存擦除(使用 cache_clear_all()),所以缓存对象将持续存在。

    我认为一个简单的解决方法是在缓存检查后手动测试过期时间,如果过期则让它重新设置缓存对象:

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

    【讨论】:

    • 不错的方法。 +1 ...编辑:刚刚注意到它是克莱夫。当然,这是一个很好的方法。
    • 你好克莱夫,“下一个通用缓存擦除”是什么? drush cc all 删除 CACHE_TEMPORARY 和 CACHE_PERMANENT。当一般的缓存滑动发生时,有什么想法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-23
    相关资源
    最近更新 更多