Страница 1 из 2

Кеширование CActiveDataProvider - возможно ли?

Добавлено: 2010.09.20, 21:01
ted
Собственно сабж. Можно ли кешировать CActiveDataProvider?

Re: Кеширование CActiveDataProvider - возможно ли?

Добавлено: 2010.09.21, 09:33
Ryadnov
http://www.yiiframework.ru/doc/guide/ru/caching.data ()

Код: Выделить всё

value=Yii::app()->cache->get($id);
if($value===false)
{
    // обновляем $value, т.к. переменная не найдена в кэше,
    // и сохраняем в кэш для дальнейшего использования:
    // Yii::app()->cache->set($id,$value);
}
 
А надо ли? :roll:

Re: Кеширование CActiveDataProvider - возможно ли?

Добавлено: 2011.02.03, 11:12
zibert02
пытаюсь кешировать CActiveDataProvider, причем стандартно Yii::app()->cache->set($id, $dataProvider); так вот при вызове

Код: Выделить всё

<?php $this->widget('zii.widgets.CListView', array(
    'dataProvider'=>$dataProvider,
    'itemView'=>'_viewGoods',
    )); ?>
получаю такую вот ошибку
Trying to get property of non-object
public function getTableSchema()
615 {
616 return $this->getMetaData()->tableSchema;
617 }
если убрать кеширование то работает
в чем проблема?

Re: Кеширование CActiveDataProvider - возможно ли?

Добавлено: 2011.02.03, 14:33
zibert02
что никто не кеширует CActiveDataProvider? или у всех он нормально работает?

Re: Кеширование CActiveDataProvider - возможно ли?

Добавлено: 2011.02.03, 14:39
samdark
А зачем его кешировать?

Re: Кеширование CActiveDataProvider - возможно ли?

Добавлено: 2011.02.03, 14:42
Nafania
По идее должно кешироваться вообще все что угодно, втч CActiveDataProvider.
Дайте побольше кода.

Re: Кеширование CActiveDataProvider - возможно ли?

Добавлено: 2011.02.03, 14:43
zibert02
чтобы уменьшить количество запросов к базе. один раз получили записи, засунули в кеш и выводим с кеша

Re: Кеширование CActiveDataProvider - возможно ли?

Добавлено: 2011.02.03, 14:45
zibert02
Nafania писал(а):По идее должно кешироваться вообще все что угодно, втч CActiveDataProvider.
Дайте побольше кода.

код самый обыкновенный. в контроллере

Код: Выделить всё

$dataProvider = new CActiveDataProvider(Goods::model()->notdeleted($id), array(
                    'pagination'=>array(
                        'pageSize'=>11
                    )
                ));
                
                Yii::app()->cache->set("GoodsList{$id}",
                            $dataProvider,
                            $this->module->cacheDuration,
                            DBDependency::GetTbDependency(Goods::model()->tableName())
                ); 
во вью

Код: Выделить всё

<?php $this->widget('zii.widgets.CListView', array(
    'dataProvider'=>$dataProvider,
    'itemView'=>'_viewGoods',
    )); ?>
в итоге лезет ошибка
Trying to get property of non-object
/home/konst/framework/db/ar/CActiveRecord.php(616)

604 */
605 public function getActiveRelation($name)
606 {
607 return isset($this->getMetaData()->relations[$name]) ? $this->getMetaData()->relations[$name] : null;
608 }
609
610 /**
611 * Returns the metadata of the table that this AR belongs to
612 * @return CDbTableSchema the metadata of the table that this AR belongs to
613 */
614 public function getTableSchema()
615 {
616 return $this->getMetaData()->tableSchema;
617 }
618
619 /**
620 * Returns the command builder used by this AR.
621 * @return CDbCommandBuilder the command builder used by this AR
622 */
623 public function getCommandBuilder()
624 {
625 return $this->getDbConnection()->getSchema()->getCommandBuilder();
626 }
627
628 /**

Re: Кеширование CActiveDataProvider - возможно ли?

Добавлено: 2011.02.03, 14:51
slavcodev
По идее кешируются данные. А dataProvider это связка кучи классов, и эти классы не подгружают в autoload.
Я кеширую

Код: Выделить всё

if(($dataProvider=Yii::app()->cache->get("GoodsList{$id}"))===false)
{
           $dataProvider = new CActiveDataProvider(Goods::model()->notdeleted($id), array(
                    'pagination'=>array(
                        'pageSize'=>11
                    )
                ));
                
                Yii::app()->cache->set("GoodsList{$id}",
                            $dataProvider->getData(),
                            $this->module->cacheDuration,
                            DBDependency::GetTbDependency(Goods::model()->tableName())
                );
}
else
   $dataProvider=new CArrayProvider($dataProvider);    

Re: Кеширование CActiveDataProvider - возможно ли?

Добавлено: 2011.02.03, 14:57
Nafania
Да, как раз хотел написать, что дело не в самом dataProvider, а в том, что он за собой тянет.
Здесь надо кешировать "Goods::model()->notdeleted($id)", а не весь dataProvider

Re: Кеширование CActiveDataProvider - возможно ли?

Добавлено: 2011.02.03, 15:04
zibert02
to mc-bear
не совсем понял ваш код

to Nafania
да, согласен что можно кешировать данные, только не совсем понятно на каком этапе?
Goods::model()->notdeleted($id) у нас тут не идет выборка, а выборка findAll идет в самом CActiveDataProvider

Re: Кеширование CActiveDataProvider - возможно ли?

Добавлено: 2011.02.03, 15:13
slavcodev
zibert02 писал(а):to mc-bear
не совсем понял ваш код
$dataProvideer->getData() возвращает массив данных (без объекта сортировки, погинации, только данные)
кешируем их.
если есть массив данных в кеше то берем и из массива создаем провайдер это CArrayProvider
пс: это все не рабочий код а теоретический, мне самому актуален вопрос кеширования

Re: Кеширование CActiveDataProvider - возможно ли?

Добавлено: 2011.02.03, 15:25
samdark
ECacheableARDataProvider?

Re: Кеширование CActiveDataProvider - возможно ли?

Добавлено: 2011.02.03, 15:27
slavcodev
Sam что это? Не могу найти ничего.

Re: Кеширование CActiveDataProvider - возможно ли?

Добавлено: 2011.02.03, 15:28
zibert02
спасибо, все работает

p.s. ECacheableARDataProvider смотрел, но у меня задача проще, главное было разобраться что именно надо кешировать

Re: Кеширование CActiveDataProvider - возможно ли?

Добавлено: 2011.02.03, 15:38
samdark
mc-bear, это предложение реализовать такую штуку :)

Re: Кеширование CActiveDataProvider - возможно ли?

Добавлено: 2011.02.03, 15:46
slavcodev
А что тогда смотрел zibert02 ? :D

Re: Кеширование CActiveDataProvider - возможно ли?

Добавлено: 2011.02.03, 16:02
samdark
mc-bear, мне тоже интересно :)

Re: Кеширование CActiveDataProvider - возможно ли?

Добавлено: 2011.02.03, 16:03
zibert02
mc-bear писал(а):А что тогда смотрел zibert02 ? :D
когда изучал вопрос по кешированию провайдера то наткнулся на какоето крутое расширение для кеширования , только вот не помню адреса
подумал что это оно и есть

Re: Кеширование CActiveDataProvider - возможно ли?

Добавлено: 2011.02.03, 16:16
slavcodev
zibert02 писал(а):только вот не помню адреса
может вспомнишь, хотел бы посмотреть :(