2011-01-28 3 views
1

で時限式のキャッシュを作成します。ブロックが多くのユーザーのためにレンダリングされるので、私はそのサービスからデータを継続的に要求したくなく、その結果をキャッシュします。しかし、このデータは比較的頻繁に変更されるため、5分または10分ごとに最新のデータを取得してから、再度キャッシュしていきたいと考えています。私は私が外部サービスから取得していた情報をレンダリングブロックをしたい私は、Drupalの7の</p> <p>を次キャッシュ動作を得ることができる方法についての詳細な情報を探していますDrupalの

誰もコードをあまり書き込まずにそのようなキャッシュ動作を達成する方法を知っていますか?私はまた、Drupal(7)でキャッシュを使用する方法に関する良い文書の点で多くを見つけていないので、その上のポインタも同様に評価されます。

答えて

3

機能cache_set()cache_get()はあなたが探しているものです。 cache_set()には有効期限切れの引数があります。

あなたはこのように、基本的にそれらを使用することができます。

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

はまた、D7に一定の時間ではなくREQUEST_TIME()を使用してください。

+0

ありがとうございました。私は明らかにD7のためにパッチを当てられたスレッドを見つけましたが、これはまだ私のインストールされたバージョンではそうではないことを確認しました。知っておいてよかった。 – Frank

+0

フランク、スレッドとして与えることの任意の変更?どのD7バージョンですか? – miguelr

+0

はい、コアのcache_get()メソッド/ワークフローでこの動作を修正するパッチはまだありますが、Drupal 7コアでは実際にコミットされ、修正されていません。 –

0

これは、$cache->expireで、有効期限はないはずです。私がをcache_set()に設定している場合、この例では、$cache->expiresは常にREQUEST_TIMEより小さくなるので、私はこの例で運がなかった。これは私のために働きます:

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