2013-12-02 3 views
0

Это похоже на простую вещь и должно быть частью базового кода для Yii, но я не могу найти решение в любом месте. Вот мой сценарий.Yii CacheDependency на основе значения кеша

1) Пользователь обновляет свою запись (используйте BeforeSave, чтобы установить значение кэша, меняется с каждым новым сохранить, PHP уникальных())

public function beforeSave() 
{ 
    Yii::app()->cache->set('userupdate'.$this->id,uniqid()); 
    return parent::beforeSave(); 
} 

2) Данные пользователя кэшируются с использованием значения кэша на первом этапе как зависимость от функции loadModel модели.

$model=Users::model()->cache(1800, $dependency)->findByPk($id); 

3) Пользователь просматривает страницу, требующую для извлечения своих данных. Yii оценивает запрос, чтобы увидеть, изменилось ли кешированное значение с шага 1, если он не вытащил из кеша, если он вытащил из db.

При чтении этой страницы (http://www.yiiframework.com/doc/guide/1.1/en/caching.data) у нее есть эта функция, если дата файла изменяется, но не одна, для нее изменяется переменная. Любая помощь в этом вопросе была бы замечательной, поскольку я не могу понять, как это реализовать.

ПРИМЕЧАНИЕ. Мне нужно использовать кеш, чтобы удерживать переменную, поскольку я запускаю несколько экземпляров моего приложения, и они должны использоваться совместно для каждого сервера и всех пользователей (поэтому сеанс не будет работать).

ответ

0

После борьбы с этим я нашел решение, не чувствую, что он полностью красив, но он действительно работает. Любые отзывы о более чистом способе очень ценятся.

$cache = Yii::app()->cache; 
    $key1 = 'userupdate'.$id; //main cache value 
    $key2 = '2userupdate'.$id; //will equal main cache when query is cached 
    $cache1 = $cache['userupdate'.$id]; 
    $cache2 = $cache['2userupdate'.$id]; 

    $dependency = new CExpressionDependency("Yii::app()->cache->get('$key1') == Yii::app()->cache->get('$key2')"); 
    $model=Users::model()->cache(1800,$dependency)->findByPk($id); 
    if($cache1 != $cache2) 
     $cache['2userupdate'.$id] = $cache['userupdate'.$id]; 
0

Один из вариантов зависимости: CExpressionDependency. Вы можете сравнить существующее кэшированное значение beforeSave со значением, которое вы получаете от вызова loadModel.

+0

Звучит просто в теории, но именно поэтому я в тупике. Я попытался захватить текущее значение кеша в value2 во время события afterFind, а затем оценить его, но это не работает. –

+0

Я пошел так просто, как этот 'if ($ cache1 == $ cache2) { $ model = Пользователи :: model() -> cache (1800) -> findByPk ($ id); } else { $ model = Пользователи :: model() -> cache (0) -> findByPk ($ id); } ' –

+0

Хорошо, нашел часть проблемы, я вызываю модельный поиск каждого запроса URL из-за расширенного UrlRule, поэтому работаю над тем, чтобы найти способ обойти это. –

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