Кэширование
- greatdane
- Сообщения: 408
- Зарегистрирован: 2010.10.20, 14:05
- Откуда: Электросталь
- Контактная информация:
Кэширование
Какой вообще смысл в кэшировании, если нельзя закэшировать самые ресурсоемкие операции работы с базой? Ни dataProvider, ни объект модели CActiveRecord не кэшируются. Какие же еще есть варианты снизить количество обращений к базе? Перегонять свойства объекта в свой массив и его кэшировать?
- RSol
- Сообщения: 325
- Зарегистрирован: 2010.05.07, 08:36
- Откуда: Северодонецк, Украина
- Контактная информация:
Re: Кэширование
Не пойму что Вы имеете ввиду...greatdane писал(а):Какой вообще смысл в кэшировании, если нельзя закэшировать самые ресурсоемкие операции работы с базой? Ни dataProvider, ни объект модели CActiveRecord не кэшируются. Какие же еще есть варианты снизить количество обращений к базе? Перегонять свойства объекта в свой массив и его кэшировать?
К примеру, при стандартной генерации:
Код: Выделить всё
public function actionIndex()
{
$dataProvider=new CActiveDataProvider('Fun');
$this->render('index',array(
'dataProvider'=>$dataProvider,
));
}
Код: Выделить всё
public function actionIndex()
{
$this->layout='main';
$val = Yii::app()->cache->get('name');
if($val === FALSE) {
$dataProvider=new CActiveDataProvider('Fun');
$val = $this->render('index',array(
'dataProvider'=>$dataProvider,
),TRUE);
Yii::app()->cache->set('name',$val,10000);
}
echo $val;
}
Re: Кэширование
Более того, вы можете кешировать выводимые блоки, а не просто результат запроса к базе.
- greatdane
- Сообщения: 408
- Зарегистрирован: 2010.10.20, 14:05
- Откуда: Электросталь
- Контактная информация:
Re: Кэширование
А вот ни фига не работает кэширование блоков. Все равно выполняются запросы к базе для получения содержимого внутри закэшированного блока.
Re: Кэширование
Меня тоже интересует вопрос топик-стартера.
Я так понимаю, что закэшировать можно только строку вывода render ()? А сам объект нельзя в кэш сунуть? Я всегда думал, что кэшируются именно объекты, а не html.RSol писал(а):Код: Выделить всё
$this->layout='main'; $val = Yii::app()->cache->get('name'); if($val === FALSE) { $dataProvider=new CActiveDataProvider('Fun'); $val = $this->render('index',array( 'dataProvider'=>$dataProvider, ),TRUE); Yii::app()->cache->set('name',$val,10000); } echo $val;
i am lost in paranoya most beautiful dream
- slavcodev
- Сообщения: 3134
- Зарегистрирован: 2009.04.02, 21:42
- Откуда: Valencia
- Контактная информация:
Re: Кэширование
dataProvider нет, точнее в том виде что он в ядре нельзя.
А вот какие проблемы с кешированием CActiveRecord мне не понятен.
Прекрасно кеширеутся
А вот какие проблемы с кешированием CActiveRecord мне не понятен.
Прекрасно кеширеутся
Код: Выделить всё
$id=intval(Yii::app()->getRequest()->getQuery('id',0));
if(!empty($id))
{
if(($data=$cache->get('news.id.'.$id))===false)
{
$data=NewsModel::model()->with('section')->findByPk($id);
$cache->set('news.id.'.$id,$data);
}
if($data===null)
throw new CHttpException(404);
}
Код: Выделить всё
$section=Yii::app()->getRequest()->getQuery('section','');
$listCacheKey='news.section.'.(empty($section)?'all':$section).'.list';
if(($list=$cache->get($listCacheKey))===false)
{
$model=NewsModel::model()->with('section');
if(!empty($section))
$model->section($section);
$criteria=$model->getDbCriteria();
$criteria->limit=5;
$list=new CActiveDataProvider($model,array(
'pagination'=>false,
'sort'=>false,
));
$cache->set($listCacheKey,$list->getData());
}
else
$list=new CArrayDataProvider($list);
Жду Yii 3!
- greatdane
- Сообщения: 408
- Зарегистрирован: 2010.10.20, 14:05
- Откуда: Электросталь
- Контактная информация:
Re: Кэширование
У меня не получилось закэшировать вот такой запрос с criteria - кэш все время возвращает false:
Вот если засовывать в кэш $d3 - всегда возвращается false при попытке достать его из кэша.
Если я пытаюсь кэшировать кусочек вьюшки, как здесь посоветовали (кэширование фрагментов), в котором используются свойства из этого объекта d3, то я вижу в логе, что все равно выполняется этот запрос к базе.
Код: Выделить всё
$criteria = new CDbCriteria;
$criteria->select = 'dog_id,name_eng,awards_eng,ped_photo_name,big_img_width,big_img_height,big_img_name,color_id,dad_eng,mom_eng';
$criteria->condition = "sex='m' and name_eng='".$d3name."'";
$d3 = Dogs::model()->find($criteria);
Если я пытаюсь кэшировать кусочек вьюшки, как здесь посоветовали (кэширование фрагментов), в котором используются свойства из этого объекта d3, то я вижу в логе, что все равно выполняется этот запрос к базе.
Re: Кэширование
Похоже просто компонент кэширования не работает.
- greatdane
- Сообщения: 408
- Зарегистрирован: 2010.10.20, 14:05
- Откуда: Электросталь
- Контактная информация:
Re: Кэширование
Посыпаю голову пеплом - была не права в обоих случаях. Отлично кэшируется и фрагмент вьюхи, и объект модели. Только почему-то в режиме разработки все равно в логе показывается, что якобы делается выборка из базы... а на продакшене все показывается как надо - закэшированное.