2012-01-25 9 views
3

私はZend_Cacheを使ってWebサービスから生成されたデータをキャッシュしています。しかし、Webサービスが応答しない場合は、古い情報を表示し、空白を残さないようにします。Zend_Cache - 期限切れのデータを取得しますか?

文書によると、答えはZend_Cache_Core::load()に2つ目の引数を渡すことです:

@param boolean $doNotTestCacheValidity If set to true, the cache validity won't be tested 

しかし、私は期限切れのキャッシュコンテンツのbool(false)を返し、常にこれをやったすべてのテストのために。

期限が切れても、Zend_Cacheが指定されたキャッシュキーのキャッシュデータを強制的に返す方法はありますか?

$cache_key = md5($url); 
if ($out = $cache->load($cache_key)) { 
    return $out; 
} 

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
$output = curl_exec($ch); 

if ($output) { 
    // Process... 
    $cn_cache->save($out, $cache_key); 
} else { 
    // The query has timed out/web service not responded 
    // We need to load the outdated cached content... but the following DOES NOT work 
    return $cache->load($cache_key, true); 

    // var_dump($cache->load($cache_key, true)); # false 
} 
+1

無効なキャッシュエントリが、それは「掃除」されていないことを、まだそこにありますか?覚えておいて、デフォルトの 'automatic_cleaning_factor'は10です。つまり、各キャッシュ書き込みで無効なキャッシュエントリが削除される可能性が10分の1になります。ちょうどspitballing ... –

+0

@DavidWeinraub私はファイルがキャッシュディレクトリにまだ存在していることを確認しましたが、ファイルが変更されたかどうかはチェックしませんでした(ファイルを削除すると削除フラグがセットされていますか? – PeterB

答えて

1

私は決しての有効期限が切れているオブジェクトの第二のキャッシュされたバージョンを持っているよりも、この他を行うには信頼性の高い方法を考えることはできません。オブジェクトのキャッシュ有効期限をX秒に設定した場合、X秒後もオブジェクトがそこに残っていることを保証する方法はありません。以下

例提案回避策...

... 
$cache_key_forever = sha1($url) 
if ($output) { 
    // Process... 
    $cn_cache->save($out, $cache_key); 
    $cn_cache->save($out, $cache_key_forever, array(), null); // The "null" parameter is the important one here: save cache indefinitely 
} else { 
    // The query has timed out/web service not responded 
    // Load the infinitely persisted cache object 
    return $cache->load($cache_key_forever); 

    // var_dump($cache->load($cache_key, true)); # false 
} 
関連する問題