Кеш-файл Zend_Cache исчезает

У меня есть кэш 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');
}

Страница, которая использует этот кеш, не очень популярна, не уверен, что это как-то связано с этим..... Есть идеи?

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() заявление.

Другие вопросы по тегам