Zend_Cache - восстановить данные с истекшим сроком? - PullRequest
3 голосов
/ 25 января 2012

Я использую 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 Ответ

1 голос
/ 29 января 2012

Я не могу придумать надежного способа сделать это, кроме как иметь вторую кэшированную версию объекта, для которого никогда не истекает.Если вы установите время истечения кеша 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
}
...