баг с кэшем CDbCacheDependency

Предварительное обсуждение найденных ошибок перед отправкой их авторам фреймворка, а также внесение новых предложений.
Ответить
kukuruku
Сообщения: 1232
Зарегистрирован: 2011.02.14, 11:36

баг с кэшем CDbCacheDependency

Сообщение kukuruku » 2015.02.17, 13:44

похоже нашел баг
код моделей

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

public function getTreeviewData()
    {
        $dependency = new CDbCacheDependency('SELECT MAX(update_time) FROM Category');
        $categorys = $this->cache(Yii::app()->params->cacheTime, $dependency)->with('children')->findAllByAttributes(['parent_id' => 0]);

        $data = [];
        foreach ($categorys as $category) {

            $children = [];

            foreach($category->children as $child) {
                $children[] = [
                    'text' => CHtml::link($child->name, ['category/index', 'code'=>$child->code]),
                ];
            }

            $data[] = [
                'text' => CHtml::link($category->name, ['category/index', 'code'=>$category->code]),
                'children' => $children
            ];

        }

        return $data;
    }
    
    public function getList($code = null)
    {
        $criteria = new CDbCriteria();
        $criteria->with = ['category', 'categorys'];
        $criteria->together = true;
        $criteria->condition = 't.paid = 1 AND t.active = 1 AND t.expiry_date > NOW()';
        $criteria->order = 't.seo2 DESC, t.seo1 DESC, t.expiry_date DESC';

        $criteria2 = new CDbCriteria;
        $criteria2->compare('categorys.code', $code);
        $criteria2->compare('category.code', $code, false, 'OR');
        $criteria->mergeWith($criteria2);

        $dependency = new CDbCacheDependency('SELECT MAX(update_time) FROM Advert');
        $dataProvider = new CActiveDataProvider($this->cache(Yii::app()->params->cacheTime, $dependency, 2), [
            'criteria'=>$criteria
        ]);

        return $dataProvider;
    }
контроллер

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

public function actionIndex($code = null)
    {
        $this->layout = 'column1';

        $this->render('index', [
            'category' => Category::model()->getCached($code),
            'dataProvider'=>Advert::model()->getList($code)
        ]);
    }
 
это вью

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

<?php
/* @var $this CategoryController */
/* @var $dataProvider CActiveDataProvider */

$this->pageTitle = Yii::app()->name;
?>

<h1><?= isset($category) ? $category->name : '' ?></h1>

<div class="span-5">
    <?php $this->widget('CTreeView', [
        'data'=>Category::model()->getTreeviewData(),
        'collapsed'=>true,
        'persist'=>'location',
    ]) ?>
</div>

<div class="span-15 ">
    <?php $this->widget('zii.widgets.CListView', array(
        'dataProvider'=>$dataProvider,
        'itemView'=>'/advert/_view',
    )); ?>
</div>

при таком порядке вызова ф-ций, getList не кешируется
если же вызвать так

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


<div class="span-15 ">
    <?php $this->widget('zii.widgets.CListView', array(
        'dataProvider'=>$dataProvider,
        'itemView'=>'/advert/_view',
    )); ?>
</div>

<div class="span-5">
    <?php $this->widget('CTreeView', [
        'data'=>Category::model()->getTreeviewData(),
        'collapsed'=>true,
        'persist'=>'location',
    ]) ?>
</div>



то кешируется нормально
или если вызвать так, тоже кеширует

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

<div class="span-15 ">
    <?php $this->widget('zii.widgets.CListView', array(
        'dataProvider'=>Advert::model()->getList(),
        'itemView'=>'/advert/_view',
    )); ?>
</div>
в чем тут проблема?

Аватара пользователя
zabachok
Сообщения: 519
Зарегистрирован: 2013.12.16, 14:38

Re: баг с кэшем CDbCacheDependency

Сообщение zabachok » 2015.02.17, 14:14

Хммм. Я тоже использовал CDbCacheDependency и при изменении выражения кэш не обновлялся. Подумал что что-то не так делаю и отложил пока. Может и правда баг?...
2b||!2b Just read the instructions

kukuruku
Сообщения: 1232
Зарегистрирован: 2011.02.14, 11:36

Re: баг с кэшем CDbCacheDependency

Сообщение kukuruku » 2015.02.18, 10:08

тут проблема именно в порядке вызова ф-ций
код в одном порядке работает, а в другом не работает

kukuruku
Сообщения: 1232
Зарегистрирован: 2011.02.14, 11:36

Re: баг с кэшем CDbCacheDependency

Сообщение kukuruku » 2015.02.20, 13:47

решил добиться справедливости
https://yadi.sk/d/mv9Q5hGdeoBeF вот пример для теста, с базой
смотреть код site/index

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

'dataProvider'=>$dataProvider, //кеш не работает
        //'dataProvider'=>Advert::model()->getList(), //кеш работает

kukuruku
Сообщения: 1232
Зарегистрирован: 2011.02.14, 11:36

Re: баг с кэшем CDbCacheDependency

Сообщение kukuruku » 2015.02.21, 09:21

разобрался, оказалось не баг а фича

xrobertdevine
Сообщения: 1
Зарегистрирован: 2015.03.07, 07:49

Re: баг с кэшем CDbCacheDependency

Сообщение xrobertdevine » 2015.03.07, 16:26

Very helpful here to a minimum set of code on which it is possible to reproduce: SQL-dump pair of tablets, one controller, a pair of meshes mapping.

Lonniekt
Сообщения: 3
Зарегистрирован: 2015.06.19, 18:05
Контактная информация:

баг с кэшем CDbCacheDependency

Сообщение Lonniekt » 2015.06.23, 04:43

Где баг-то? Точное исполнение инструкций менеджера. Если бы было понятно, чего ты вообще хотел добиться этими инструкциями, может быть, я бы тебе объяснил, как это сделать. Но пока мне это непонятно.

Ответить