Работа с memcache с Yii и ActiveRecords

1

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

Это моя конфигурация для БД:

'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() было изменено, чтобы начать, как \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
    К вашему сведению: return Customer::findOne(1); также будет работать.
  • 0
    @Blizz Blizz, да, это была просто копия из документа Yii.
Теги:
yii2
yii
memcached

1 ответ

3
Лучший ответ

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

В документации для $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() -method для каждого класса ActiveRecord вы хотите кэшировать, чтобы вернуть один из экземпляров ActiveQuery.

public static function find()
{
    return Yii::createObject(MyActiveQuery::className(), [get_called_class()]);
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню