所以我一直在努力让运行Yii 2的网站上运行memcache。我已经让缓存为数据库架构工作了,但它似乎不适用于ActiveRecord查询
这是我对DB的配置:
'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),这应该足以让全局缓存起作用。根据我的理解,如果设置了这些变量,那么它应该在指定的时间内缓存所有查询,或者我是否还必须专门调用if以下内容?
$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 :(得分:4)
如果你真的想要缓存"对于所有查询"您最好启用数据库的查询缓存。这样做要好得多。除了数据库模式之外,除非您明确启用它,否则不会进行缓存,就像在您的示例中一样。
$enableQueryCache
的{{3}}明确说明:
是否启用查询缓存。请注意,为了启用查询缓存,必须启用$ queryCache指定的有效缓存组件,并且必须将$ enableQueryCache设置为true。 此外,只会缓存cache()中包含的查询结果。
如果你真的想这样做,有办法破解它,但IMO不值得:
创建自己的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()]);
}