Таким образом, я пытался получить 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 по умолчанию для всех запросов?
благодаря
Если вы действительно хотите кэшировать "для всех запросов", вам лучше включить кеш запросов в вашей базе данных. Это намного лучше. Помимо схемы базы данных, кеширование продолжается, если вы явно не включили его, как в вашем примере.
В документации для $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()]);
}
return Customer::findOne(1);
также будет работать.