0

我有一个 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

1 回答 1

0

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

我认为您误解了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()

于 2011-04-08T00:46:19.090 回答