我使用Yii php框架构建了机密网站。现在它获得了大量的流量。所以我想使用缓存来优化网站的性能。
我想要优化两个控制器。
一个是线程列表控制器:(示例)http://www.shichengbbs.com/category/view/id/15
另一个是线程控制器:(示例)http://www.shichengbbs.com/info/view/id/67900
我做了什么:
线程列表缓存3分钟。(另一个选项是仅在新线程出现时更新线程列表)
设置线程视图的上次修改时间HTTP标头。 (未设置过期时间,因为有些用户抱怨编辑后页面显示不变)
部分缓存类别导航片段。(它显示在每个页面的左侧)
使用htaccess为img / html / css / js设置过期标题。
考虑了线程列表的数据库sql缓存,但没有完成。我认为它与1相同。
我还可以做些什么来改善网站效果?
答案 0 :(得分:4)
我认为你已经完成了Performance Tuning guide第1点和第3点。这真的很有帮助。
对于2号,您可以使用CHttpCacheFilter
class CategoryController extends Controller { private $_categoryLastUpdate; public function filters(){ return array( array( 'CHttpCacheFilter + view', 'cacheControl' => " max-age=604800, must-revalidate", 'etagSeedExpression' => function() { return $this->getCategoryLastUpdate(); } 'lastModifiedExpression' => function() { return $this->getCategoryLastUpdate(); } ) ) } public function actionView($id){ $object = Category::model()->findByPk($_GET['id']); $this->render('view', array('object' => $object)); } public function getCategoryLastUpdate(){ if (!isset($this->_categoryLastUpdate)){ $obj = Category::model()->findByPk($_GET['id'], array('select' => 'lastUpdate')); $this->_categoryLastUpdate } return $this->_categoryLastUpdate; } }
它基本上将按类别计算ETag和LastUpdate。要保存查询,它首先只会计算lastUpdate
对象的Category
。
对于第一名,您始终可以使用CCacheDependency。只需在线程列表对象中创建一个字段,例如lastUpdate
。当提交新线程时,只需更新该字段并将其用于CCacheDependency。
由于我发现您使用的是非常大的分页,我想您想阅读Four Ways to Optimize Paginated Displays(如果您使用MySQL作为数据库和线程搜索/列表)。
答案 1 :(得分:0)
尝试使用带有Memcache或APC的缓存管理器。例如,http://code.google.com/p/memcache-flag/。编辑列表时,可以使缓存项或标记无效。我想如果您的设计很简单,也可以使用常规的APC / Memcache功能(设置一个密钥并在它不再有效时将其删除)。
使用它来存储序列化(或自动序列化)的数据,而不是从mysql中检索它。