我开始在Yii2框架中沾上我的第一根手指。使用ActiveRecord查询数据时,我想使用查询缓存。我这样查询:
$BestCustomers = SaleOrder::getDb()->cache(function ($db) {
return SaleOrder::find()
->with(['preOrder', 'invoice', 'articlesOut', 'articlesOut.product'])
->limit(8)->all();
});
似乎工作,但如何知道它是否真的从缓存而不是数据库获取数据?
从表现方面来看,我没有看到任何重大变化,这就是为什么即使它真的有效也能保留。
答案 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中找到迁移。如果使用文件缓存,则不需要此步骤。
接下来,您要确保以正确的方式配置数据库组件。有几个与缓存相关的属性。最重要的是enableSchemaCache
和enableQueryCache
。特别是两者中的第一个对性能产生了巨大影响。根据您的调试状态设置这两者是个好主意。以下是我倾向于为缓存配置数据库连接的示例:
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,
];
我在一个操作中使用此方法来刷新缓存应用程序端。您希望在进行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网站的底部看到一个“工具栏”。您可能需要单击以展开它。查找“数据库”部分,以查看为给定调用准确运行了哪些查询。如果缓存工作正常,则只会在初始页面加载期间(在缓存值之前)看到给定的查询-后续加载不应再显示正在运行的查询。