使用Yii和ActiveRecords的memcache

时间:2015-05-25 20:07:48

标签: php yii memcached yii2

所以我一直在努力让运行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进行所有查询?

由于

1 个答案:

答案 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()]);
}