2015-05-25 3 views
1

Итак, я пытаюсь получить работу memcache на моем сайте с Yii 2. У меня есть кеширование, работающее на материал схемы базы данных, но, похоже, это не работает для ActiveRecord запросы.Работа с memcache с Yii и ActiveRecords

Это мой конфиг для БД:

'db' => [ 
    'class'     => 'yii\db\Connection', 
    'dsn'     => 'mysql:host=127.0.0.1;dbname=db_name', 
    'username'    => 'user_name', 
    'password'    => 'password', 
    'charset'    => 'utf8', 
    'enableQueryCache'  => true, 
    'queryCache'   => 'cache', 
    'queryCacheDuration' => 600, 
    'enableSchemaCache'  => true, 
    'schemaCache'   => 'cache', 
    'schemaCacheDuration' => 3600, 
] 

По словам гида (http://www.yiiframework.com/doc-2.0/guide-caching-data.htm), это должно быть достаточно, чтобы получить глобальное кэширование работает. Насколько я понимаю, если эти переменные установлены, то он должен кэшировать все запросы за указанное время или мне еще нужно специально позвонить, если со следующим?

$result = Customer::getDb()->cache(function ($db) { 
    return Customer::find()->where(['id' => 1])->one(); 
}); 

Я пошел рыть в кодовую базу, чтобы увидеть, что происходит, и это похоже на \yii\db\Connection::getQueryCacheInfo() был изменен, чтобы начать следующий вид: он будет работать отлично:

public function getQueryCacheInfo($duration, $dependency) 
{ 

    if (!$this->enableQueryCache) { 
     return null; 
    } 

    $duration = (isset($duration)) ? $duration : $this->queryCacheDuration; 
    $dependency = (isset($dependency)) ? $dependency : $this->queryCache; 

Могу ли я сделать что-то Неправильно здесь? Почему я не могу использовать memcache по умолчанию для всех запросов?

Благодаря

+0

FYI: 'return Customer :: findOne (1);' также будет работать. – Blizz

+0

@Blizz, да, это была только копия-паста из документа Yii. – SynackSA

ответ

3

Если вы действительно хотите кэширования «для всех запросов» вы бы лучше стимулирующей кэш запросов базы данных. Это намного лучше. Помимо схемы базы данных, кеширование продолжается, если вы явно не включили его, как в вашем примере.

documentation для $enableQueryCache ясно заявляет об этом:

ли включить кэширование запросов. Обратите внимание, что для включения кэширования запросов должен быть включен допустимый компонент кэша, указанный в параметре $ queryCache, и $ enableQueryCache должен быть установлен true. Также будут кэшироваться только результаты запросов, заключенных в cache().

Если вы действительно хотите сделать это, есть способ взломать его, но ИМО это не стоит:
Создайте свой собственный ActiveQuery производный класс. В своем методе createCommand() уже включить кэширование перед возвратом объекта команды:

class MyActiveQuery extends ActiveQuery 
{ 
    public function createCommand($db = null) 
    { 
     $command = parent::createCommand(db); 
     $command->cache(); 
     return $command; 
    } 
} 

Тогда вы должны переопределить find() -метод каждые ActiveRecord класса, который вы хотите, чтобы в кэше, чтобы вернуть один из ваших ActiveQuery случаев вместо этого.

public static function find() 
{ 
    return Yii::createObject(MyActiveQuery::className(), [get_called_class()]); 
} 
Смежные вопросы