Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Yii中的模式缓存_Php_Caching_Yii - Fatal编程技术网

Php Yii中的模式缓存

Php Yii中的模式缓存,php,caching,yii,Php,Caching,Yii,在这里,我们可以看到以下信息: “如果应用程序正在使用活动记录,我们应该打开架构缓存以节省分析数据库架构的时间。这可以通过将CDbConnection::schemaCachingDuration属性配置为大于0的值来完成。” 我有一些问题要问: 1。为什么要使用架构缓存? 2。架构缓存是如何工作的? 3。在哪里可以看到测试?如果要启用,您将看到CActiveRecord对象在每次应用程序运行时读取各自的表架构。您可以查看和的代码,看看这是如何完成的。缓存架构可以减少对数据库的调用次数,从而加快

在这里,我们可以看到以下信息:

“如果应用程序正在使用活动记录,我们应该打开架构缓存以节省分析数据库架构的时间。这可以通过将
CDbConnection::schemaCachingDuration属性配置为大于0的值来完成。

我有一些问题要问:

1。为什么要使用架构缓存?

2。架构缓存是如何工作的?


3。在哪里可以看到测试?

如果要启用,您将看到
CActiveRecord
对象在每次应用程序运行时读取各自的表架构。您可以查看和的代码,看看这是如何完成的。缓存架构可以减少对数据库的调用次数,从而加快应用程序的速度,因为数据库通常是应用程序的瓶颈。

如果将Yii设置为记录数据库查询(
'enableParamLogging'=>在配置文件的数据库设置中为true
)您可以看到,Yii经常查询数据库中的ActiveRecord查询

例如:假设您有一个名为
User
的模型,并且您告诉Yii通过主键为您获取一个用户,Yii将查询数据库三次(!)。它将执行
show columns
查询,然后执行
show create table
查询,最后查询数据库中的实际数据。前两个查询非常简单,因此我知道
user
表的模式。如果从应用程序服务器到数据库服务器的往返时间是100ms(如果真的这么慢,您应该做些什么),那么这两个获取模式的查询将使应用程序响应时间至少增加200ms。它将对填充您的
用户
模型的每个请求执行此操作。根据应用程序的编写方式,它甚至可能在一个请求中执行多次

另一方面,如果您告诉Yii使用模式缓存,Yii将检查缓存,查看它是否已经知道
用户
表的模式,如果知道,它将使用该模式而不是访问数据库。在检查缓存时仍然存在延迟,但希望它小于或等于数据库服务器的延迟。假设您使用Redis服务器进行缓存,它的延迟也为100毫秒(同样长得离谱)。缓存模式仍然比查询数据库快,因为Yii只需要查询缓存一次就可以检索模式,而不是两次访问数据库


因此,在本例中,从查询模式的高延迟数据库切换到查询高延迟缓存服务器仍然可以节省时间。实际上,缓存的延迟应该比数据库低得多,因此可以节省更多的时间,如果应用程序非常复杂,Yii将在每个请求上从多个表加载架构,因此架构缓存可以大大缩短请求响应时间。

您能否澄清第一个问题?@topher我的意思是为什么我们应该使用此缓存。第一个问题与第二个和第三个有关。如何手动刷新架构缓存?我认为我的生产服务器正在缓存表的模式。我运行了一次迁移以添加列,但当我尝试设置字段时,它会抱怨
错误:设置未知属性:app\models\AdGroupKeywordNetwork::ebay\u revenue
。它在开发中起作用。我找到了答案<代码>Yii::$app->cache->flush()我将我的开发人员指向PROD,并可以在一个简单的控制台命令中运行它。我将把这条评论添加到书签中。您还可以在Redis中直接刷新缓存: