【发布时间】:2012-12-12 09:40:51
【问题描述】:
我只是好奇CGridView在Yii Framework中的表现。我用 Yii 构建了一个简单的应用程序。在模型的管理页面上,简单地列出所有记录,分页 (30/page) 和自定义排序,到目前为止效果很好。
但我发现渲染 CGridView 需要 4-5 秒。在 4-5 秒内呈现 30 条记录页面是否正常?感觉有点慢啊!因为它不是一个复杂的表,只有 8 列。生成的 SQL 查询运行速度很快(在 2-3 毫秒内完成),尽管包括一些关系。
我google了很多优化,找到了这个官方文档: http://www.yiiframework.com/doc/guide/1.1/en/topics.performance
关注CGridView的问题,尝试使用缓存,发现COutputCache确实是个好帮手。
我的做法是在Controller的filter()函数中加入COutputCache:
public function filters()
{
return array(
'accessControl', // perform access control for CRUD operations
array( 'COutputCache+admin,_lists', 'duration' => 600,'varyByParam'=>array('sort','page'), ),
);
}
你可以添加普通视图页面和部分页面,以秒为单位设置过期时间,并告诉 Yii 哪个参数来检测缓存更改。
当您重新访问页面时,这会很有帮助,包括排序和分页。将页面渲染时间降低到 40-50 毫秒,这太棒了!
但是我还没有找到加速第一次渲染的好方法。你有什么好的建议吗?
【问题讨论】:
-
4-5 秒对于 CGridView 来说似乎真的很长。你是在使用“标准”的 Gii CRUD 生成的 gridview 还是修改了很多?
-
看一下 yii 日志,看看你的代码哪一部分是慢的。确保您使用
renderPartial来处理网格视图 ajax 请求。你可以试试yiiboosterjson 网格视图。 -
我要从分析摘要开始,最初的 SQL 可能看起来很小,但上面的 3 个关系为您提供了额外的 90 个查询,可以在 30 条记录的页面上运行。跨度>
-
我在挖掘Framework的源码,CGridView->renderTableBody() 占用了95%的页面渲染时间。会深入挖掘。