Yii2 ActiveRecord查询缓存。怎么知道?

时间:2016-10-13 11:08:54

标签: caching activerecord yii2

我开始在Yii2框架中沾上我的第一根手指。使用ActiveRecord查询数据时,我想使用查询缓存。我这样查询:

$BestCustomers = SaleOrder::getDb()->cache(function ($db) {
    return SaleOrder::find()
        ->with(['preOrder', 'invoice', 'articlesOut', 'articlesOut.product'])
        ->limit(8)->all();
});

似乎工作,但如何知道它是否真的从缓存而不是数据库获取数据?

从表现方面来看,我没有看到任何重大变化,这就是为什么即使它真的有效也能保留。

2 个答案:

答案 0 :(得分:1)

知道何时达到缓存

您有几种选择。只有在重新获取数据时才会执行callable中的代码。因此,如果您在其中编写日志条目或设置断点,您将知道何时从数据库加载数据。 您还可以截断缓存,重新加载页面并比较文件大小(FileCache)或缓存表(DB缓存)的db条目。这一切都取决于您的缓存配置。

持续时间和依赖性

如果您想更具体地说明何时加载数据,缓存有效期及其依赖的时间,请查看缓存函数的参数。您可以找到包含doc here的代码。  只需设置一个dependency即可。

缓存配置

这里涉及两个部分。首先将缓存组件配置为使用Yii2之一several options。这是在cache - 部分的配置文件中完成的。最常见的是文件和数据库缓存。

'cache'=>[
    'class'=>'yii\caching\DbCache',
],

如果要使用数据库缓存,首先必须应用创建缓存表的迁移。您可以在vendor\yiisoft\yii2\caching\migrations下的yii-folder中找到迁移。如果使用文件缓存,则不需要此步骤。

用于缓存的DB-Config

接下来,您要确保以正确的方式配置数据库组件。有几个与缓存相关的属性。最重要的是enableSchemaCacheenableQueryCache。特别是两者中的第一个对性能产生了巨大影响。根据您的调试状态设置这两者是个好主意。以下是我倾向于为缓存配置数据库连接的示例:

return [
    'class'=>'yii\db\Connection',
    'dsn'=>'mysql:host=localhost;dbname=xxxxx-local',
    'username'=>'root',
    'password'=>'',
    'charset'=>'utf8',

    'enableSchemaCache'=>!YII_DEBUG,
    'schemaCacheDuration'=>3600,
    'schemaCache'=>'cache',

    'enableQueryCache'=>!YII_DEBUG,
    'queryCacheDuration'=>3600,
];

Goodie:刷新缓存代码端的方法

我在一个操作中使用此方法来刷新缓存应用程序端。您希望在进行db-migration以断言新模式被重新访问后执行此操作。

protected function flushCache($id='cache')
{
    if (!isset(Yii::$app->{$id}) || !(Yii::$app->{$id} instanceof Cache)) {
        $msg = Yii::t('Invalid cache to flush: {cache}', ['cache'=>$id]);
        throw new InvalidParamException($msg);
    }

    /* @var $cache \yii\caching\Cache */
    $cache = Yii::$app->{$id};
    if ($cache->flush()) {
        $msg = Yii::t('app', 'Successfully flushed cache `{cache}`', ['cache'=>$id]);
        Yii::$app->session->setFlash('success', $msg);
    } else {
        $msg = Yii::t('app', 'Problem while flushing cache `{cache}`', ['cache'=>$id]);
        Yii::$app->session->setFlash('danger', $msg);
    }
}

答案 1 :(得分:0)

另一个选择是添加yii2-debug extension,以在您的站点上显示出色的调试工具栏。如果您正确安装和配置了扩展程序,则您应该在Yii2网站的底部看到一个“工具栏”。您可能需要单击以展开它。查找“数据库”部分,以查看为给定调用准确运行了哪些查询。如果缓存工作正常,则只会在初始页面加载期间(在缓存值之前)看到给定的查询-后续加载不应再显示正在运行的查询。