Я столкнулся с некоторой дилеммой с системой кэширования Cake 2.4, и мне было интересно, может ли кто-нибудь подумать о простом решении.Кэширование в CakePHP на основе даты окончания записи
Я создал функцию внутри компонента, который я использую для подключения к API для получения данных. Я также хочу кэшировать данные, чтобы сделать их более эффективными.
Проблема в том, что точно, когда срок действия кеша истекает, зависит от поля в массиве $result
(из API), которое называется $result['expiry']
. Таким образом, я сделал это:
class ApiComponent extends Component {
public function getRecords($data) {
$cacheName = $data['Model'] . "_" . $data['action'];
// IMPOSSIBLE because we don't have $result:
// Cache::set(array('duration' => '+' . $result['expiry'] . ' days'));
$result = Cache::read($cacheName);
if (!$result) {
$result = $this->connect('getRecords',$data);
Cache::set(array('duration' => '+' . $result['expiry'] . ' days'));
Cache::write($cacheName, $result);
}
return $result;
}
public function connect($endpoint,$data) {
// Code for connecting to the API
}
}
Проблема заключается в том, что по какой-то причине, торт нужно мне, чтобы указать истечение срока для записи и чтения, несмотря на истечение срока временной метки присутствует в самом файле кэша.
Я оценил нужную строку как IMPOSSIBLE
в моем примере выше. Согласно the book, так оно и должно работать. К сожалению, для меня это не имеет большого значения.
Я понимаю того, чтобы установить срок до записи но зачем мне нужно, чтобы установить срок перед чтения когда сам кэш-файл имеет метку времени UNIX с указанием точно, когда истекает кэш, основанный на том, что я сделал, когда я установил написать.
Обратите внимание, что доступ к API составляет всего 100 мс, поэтому не было бы никакого смысла сохранять срок действия базы данных и получать доступ к ней каждый раз, если я также не кэшировал выход локальной базы данных, но это похоже на поистине потрясающую вещь необходимо выполнить: кеширование истечения срока действия кеша!
Спасибо @ndm. Я предположил (и не тестировал), что если бы я установил длительность на высокое значение при чтении, это остановило бы кеш от недействительности, если бы отметка времени была раньше. Но теперь я вижу, что это не так. Установка его на +10 лет является довольно уродливой, но она решает проблему с 1 строкой кода, а не с моим 10-строчным решением, которое связано с кэшированием метки времени кеша в отдельном кеше :-) – Joseph