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

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
ted
Сообщения: 17
Зарегистрирован: 2010.07.14, 07:19

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

Сообщение ted »

Собственно сабж. Можно ли кешировать CActiveDataProvider?
Аватара пользователя
Ryadnov
Сообщения: 456
Зарегистрирован: 2010.06.20, 00:38
Откуда: Санкт-Петербург

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

Сообщение 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:
zibert02
Сообщения: 203
Зарегистрирован: 2010.11.24, 17:29

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

Сообщение 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 }
если убрать кеширование то работает
в чем проблема?
zibert02
Сообщения: 203
Зарегистрирован: 2010.11.24, 17:29

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

Сообщение zibert02 »

что никто не кеширует CActiveDataProvider? или у всех он нормально работает?
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

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

Сообщение samdark »

А зачем его кешировать?
Nafania
Сообщения: 1227
Зарегистрирован: 2011.01.31, 13:12

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

Сообщение Nafania »

По идее должно кешироваться вообще все что угодно, втч CActiveDataProvider.
Дайте побольше кода.
zibert02
Сообщения: 203
Зарегистрирован: 2010.11.24, 17:29

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

Сообщение zibert02 »

чтобы уменьшить количество запросов к базе. один раз получили записи, засунули в кеш и выводим с кеша
zibert02
Сообщения: 203
Зарегистрирован: 2010.11.24, 17:29

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

Сообщение 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 /**
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

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

Сообщение 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);    
Жду Yii 3!
Nafania
Сообщения: 1227
Зарегистрирован: 2011.01.31, 13:12

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

Сообщение Nafania »

Да, как раз хотел написать, что дело не в самом dataProvider, а в том, что он за собой тянет.
Здесь надо кешировать "Goods::model()->notdeleted($id)", а не весь dataProvider
zibert02
Сообщения: 203
Зарегистрирован: 2010.11.24, 17:29

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

Сообщение zibert02 »

to mc-bear
не совсем понял ваш код

to Nafania
да, согласен что можно кешировать данные, только не совсем понятно на каком этапе?
Goods::model()->notdeleted($id) у нас тут не идет выборка, а выборка findAll идет в самом CActiveDataProvider
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

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

Сообщение slavcodev »

zibert02 писал(а):to mc-bear
не совсем понял ваш код
$dataProvideer->getData() возвращает массив данных (без объекта сортировки, погинации, только данные)
кешируем их.
если есть массив данных в кеше то берем и из массива создаем провайдер это CArrayProvider
пс: это все не рабочий код а теоретический, мне самому актуален вопрос кеширования
Жду Yii 3!
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

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

Сообщение samdark »

ECacheableARDataProvider?
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

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

Сообщение slavcodev »

Sam что это? Не могу найти ничего.
Жду Yii 3!
zibert02
Сообщения: 203
Зарегистрирован: 2010.11.24, 17:29

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

Сообщение zibert02 »

спасибо, все работает

p.s. ECacheableARDataProvider смотрел, но у меня задача проще, главное было разобраться что именно надо кешировать
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

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

Сообщение samdark »

mc-bear, это предложение реализовать такую штуку :)
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

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

Сообщение slavcodev »

А что тогда смотрел zibert02 ? :D
Жду Yii 3!
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

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

Сообщение samdark »

mc-bear, мне тоже интересно :)
zibert02
Сообщения: 203
Зарегистрирован: 2010.11.24, 17:29

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

Сообщение zibert02 »

mc-bear писал(а):А что тогда смотрел zibert02 ? :D
когда изучал вопрос по кешированию провайдера то наткнулся на какоето крутое расширение для кеширования , только вот не помню адреса
подумал что это оно и есть
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

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

Сообщение slavcodev »

zibert02 писал(а):только вот не помню адреса
может вспомнишь, хотел бы посмотреть :(
Жду Yii 3!
Ответить