2011-11-13 40 views
6

Tôi có một cuộc gọi máy chủ khá tốn kém mà tôi cần phải lưu trong bộ nhớ cache trong 30 giây. Có vẻ như tuy nhiên tôi không thể nhận được bộ nhớ cache hết hạn.Mục bộ nhớ cache tạm thời Drupal 7 sẽ không hết hạn

Trong mã bên dưới, sau lần đầu tiên bộ đệm lưu trữ, nó sẽ không bao giờ vượt qua $ return-> cache_data, ngay cả sau thời gian() + 30 giây.

Lưu ý, tôi thậm chí có thể in $ cache-> hết hạn và nó chắc chắn được đặt thành thời gian trong 30 giây trước và không bao giờ cập nhật.

Tôi đã xóa bộ nhớ cache theo cách thủ công nhiều lần để xác nhận tôi nhận được kết quả tương tự.

Có vấn đề gì với điều này không?

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

Trả lời

10

Không có gì sai với mã của bạn như vậy, tôi nghĩ vấn đề là cách hoạt động cache_set. Từ số docs page, chuyển dấu thời gian UNIX:

Cho biết rằng mục phải được giữ ít nhất cho đến thời gian nhất định, sau đó nó sẽ hoạt động như CACHE_TEMPORARY.

CACHE_TEMPORARY cư xử như thế này:

Chỉ ra rằng mục cần được loại bỏ ở bộ nhớ cache chung tiếp theo lau.

Dự đoán tốt nhất của tôi là vì bạn không ngầm buộc xóa bộ nhớ cache chung đó (sử dụng cache_clear_all()) đối tượng bộ nhớ cache sẽ vẫn tồn tại.

Tôi nghĩ một cách đơn giản xung quanh nó sẽ chỉ được tự kiểm tra thời hạn sử dụng sau khi kiểm tra bộ nhớ cache của bạn, và để cho nó rơi qua để tái thiết rằng đối tượng bộ nhớ cache nếu nó đã hết hạn:

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

Cám ơn kiểm tra sanity. – Coder1

+1

Cách tiếp cận tốt đẹp. 1 ... EDIT: Chỉ cần nhận thấy nó là Clive. Tất nhiên đó là một cách tiếp cận tốt. –

+0

Xin chào Clive, "bộ nhớ cache chung tiếp theo" là gì? drush cc tất cả đều loại bỏ cả CACHE_TEMPORARY & CACHE_PERMANENT. Khi vuốt bộ nhớ cache chung xảy ra, bất kỳ ý tưởng nào? –

Các vấn đề liên quan