Кэширование

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
Аватара пользователя
greatdane
Сообщения: 408
Зарегистрирован: 2010.10.20, 14:05
Откуда: Электросталь
Контактная информация:

Кэширование

Сообщение greatdane »

Какой вообще смысл в кэшировании, если нельзя закэшировать самые ресурсоемкие операции работы с базой? Ни dataProvider, ни объект модели CActiveRecord не кэшируются. Какие же еще есть варианты снизить количество обращений к базе? Перегонять свойства объекта в свой массив и его кэшировать?
Аватара пользователя
RSol
Сообщения: 325
Зарегистрирован: 2010.05.07, 08:36
Откуда: Северодонецк, Украина
Контактная информация:

Re: Кэширование

Сообщение RSol »

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;
    }
 
А если учесть, что в Yii::app()->cache->set('name',$val,10000); можно установить 4-й параметр CCacheDependency, то вообще на все случаи жизни.
Nafania
Сообщения: 1227
Зарегистрирован: 2011.01.31, 13:12

Re: Кэширование

Сообщение Nafania »

Более того, вы можете кешировать выводимые блоки, а не просто результат запроса к базе.
Аватара пользователя
greatdane
Сообщения: 408
Зарегистрирован: 2010.10.20, 14:05
Откуда: Электросталь
Контактная информация:

Re: Кэширование

Сообщение greatdane »

А вот ни фига не работает кэширование блоков. Все равно выполняются запросы к базе для получения содержимого внутри закэшированного блока.
Аватара пользователя
xmm4n
Сообщения: 10
Зарегистрирован: 2010.11.21, 00:45

Re: Кэширование

Сообщение xmm4n »

Меня тоже интересует вопрос топик-стартера.
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;
 
Я так понимаю, что закэшировать можно только строку вывода render ()? А сам объект нельзя в кэш сунуть? Я всегда думал, что кэшируются именно объекты, а не html.
i am lost in paranoya most beautiful dream
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: Кэширование

Сообщение slavcodev »

dataProvider нет, точнее в том виде что он в ядре нельзя.
А вот какие проблемы с кешированием 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: Кэширование

Сообщение greatdane »

У меня не получилось закэшировать вот такой запрос с criteria - кэш все время возвращает false:

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

$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 - всегда возвращается false при попытке достать его из кэша.
Если я пытаюсь кэшировать кусочек вьюшки, как здесь посоветовали (кэширование фрагментов), в котором используются свойства из этого объекта d3, то я вижу в логе, что все равно выполняется этот запрос к базе.
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: Кэширование

Сообщение slavcodev »

покажи код
Жду Yii 3!
Аватара пользователя
RSol
Сообщения: 325
Зарегистрирован: 2010.05.07, 08:36
Откуда: Северодонецк, Украина
Контактная информация:

Re: Кэширование

Сообщение RSol »

mc-bear писал(а):покажи код
и конфиг (что касается кешировани)
youroff
Сообщения: 228
Зарегистрирован: 2010.02.25, 16:05

Re: Кэширование

Сообщение youroff »

Похоже просто компонент кэширования не работает.
Аватара пользователя
greatdane
Сообщения: 408
Зарегистрирован: 2010.10.20, 14:05
Откуда: Электросталь
Контактная информация:

Re: Кэширование

Сообщение greatdane »

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