2013-11-25 2 views
2

Я столкнулся с некоторой дилеммой с системой кэширования 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 мс, поэтому не было бы никакого смысла сохранять срок действия базы данных и получать доступ к ней каждый раз, если я также не кэшировал выход локальной базы данных, но это похоже на поистине потрясающую вещь необходимо выполнить: кеширование истечения срока действия кеша!

ответ

1

Теоретически, при чтении из кеша вам необязательно понадобиться продолжительность. Причина его доступности при чтении заключается в том, чтобы иметь возможность аннулировать кеш в случае изменения продолжительности с момента кэширования данных.

https://github.com/cakephp/cakephp/commit/caa7bb621871706baf664b5e2e4f562353f3671f

К сожалению, нет чистого способа преодоления этого авто-магии в качестве значения duration опции будет использоваться независимо от того, что, когда он не используется нестандартными один, будет использоваться один из конфигурации по умолчанию, и если он ниже, чем тот, который используется для записи, то ваш кеш будет недействительным преждевременно.

А (вроде уродливые) обходной путь будет установить необычайно высокую duration фиктивное значение для операции чтения, вы теряете автоматическую магию, но кэш не собирается быть признан недействительным преждевременно:

Cache::set(array('duration' => '+10 years')); 
$result = Cache::read($cacheName); 
+0

Спасибо @ndm. Я предположил (и не тестировал), что если бы я установил длительность на высокое значение при чтении, это остановило бы кеш от недействительности, если бы отметка времени была раньше. Но теперь я вижу, что это не так. Установка его на +10 лет является довольно уродливой, но она решает проблему с 1 строкой кода, а не с моим 10-строчным решением, которое связано с кэшированием метки времени кеша в отдельном кеше :-) – Joseph

Смежные вопросы