2012-01-25 4 views
3

Я использую Zend_Cache для кэширования данных, созданных с помощью веб-службы. Однако, если веб-служба не отвечает, я хочу отобразить устаревшую информацию и не оставлять пустое место.Zend_Cache - получить истекшие данные?

Согласно документации, ответ должен пройти второй аргумент Zend_Cache_Core::load():

@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, что означает вероятность« 1-в-10 »недействительных записей кэша, удаляемых при каждой записи кеша. Просто 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 
} 
Смежные вопросы