【问题标题】:Zend_Cache cache file disappearsZend_Cache 缓存文件消失
【发布时间】:2011-04-06 07:51:21
【问题描述】:

我有一个 zend 缓存,它存储数据库中的一个数组。可以很好地读取和更新缓存。但是实际的缓存文件似乎在一天左右后消失了。我以为添加automatic_cleaning_factor = 0 可以解决这个问题,但似乎并非如此。

$frontendOptions = array(
    'caching' => true,
    'cache_id_prefix' => 'mysite_blah',
    'lifetime' => 14400, # 4 hours
    'automatic_serialization' => true,
    'automatic_cleaning_factor' => 0,
);
$backendOptions = array(
    'cache_dir' => "{$_SERVER['DOCUMENT_ROOT']}/../../cache/zend_cache/"
);
$cache = Zend_Cache::factory('Core', 'File', $frontendOptions, $backendOptions);

if(!$result = $cache->load('test_blah'))
{
    // run SQL
    ...    
    $cache->save($my_array_from_db, 'test_blah');
}
else
{
     $result = $cache->load('test_blah');
}

使用此缓存的页面不是很受欢迎,不确定是否与它有关......有什么想法吗?

【问题讨论】:

  • 我不能在那里发表评论吗...?
  • 嗯,我的意思是缓存将在 4 小时后消失。呃,抱歉,看起来 automatic_cleaning_factor 应该停止这个。也许系统清理了缓存目录?

标签: zend-framework zend-cache


【解决方案1】:

我无法解释为什么您的文件消失了,我认为您的示例中缺少一些可能正在删除缓存文件的内容。不过,我可以提供一些可能对您有所帮助的笔记...

我认为您误解了 automatic_cleaning_factor 参数。这不会禁止您的缓存过期。这只会禁止缓存前端自动清除在您调用save() 方法时可能已过期的任何缓存。

当你load()你的缓存时,它仍然会被测试是否有效,如果无效,它会被忽略并且你的数据库将被查询以获取新数据。您可以将true 作为load() 上的第二个参数传递以忽略有效性测试。

但是您可能应该将lifetime 设置为很长的时间,而不是覆盖缓存验证,因为它的存在是有原因的。

另外,这段代码可以简化:

if(!$result = $cache->load('test_blah')) {
    // run SQL
    ...    
    $cache->save($my_array_from_db, 'test_blah');
} else {
     $result = $cache->load('test_blah');
}

收件人:

if(!$result = $cache->load('test_blah')) {
    // run SQL
    ...   
    $result = $my_array_from_db;
    $cache->save($result, 'test_blah');
}

不需要else,因为缓存中的$result 是在if() 语句中分配的。

【讨论】:

  • 感谢您的解释。如果它解决了我的问题,我会将这些付诸实施并报告。
  • 思考:如果 load() 验证失败,此时是否会删除缓存文件?或者它的缓存文件只在 save() 中删除/更新
  • 由于去掉了不必要的else块,这个问题就消失了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-17
  • 2012-12-03
  • 2022-08-23
  • 2014-01-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多