如何使用缓存来提高分类网站的性能?

时间:2013-02-22 00:59:05

标签: database performance caching yii

我使用Yii php框架构建了机密网站。现在它获得了大量的流量。所以我想使用缓存来优化网站的性能。

我想要优化两个控制器。

一个是线程列表控制器:(示例)http://www.shichengbbs.com/category/view/id/15

另一个是线程控制器:(示例)http://www.shichengbbs.com/info/view/id/67900

我做了什么:

  1. 线程列表缓存3分钟。(另一个选项是仅在新线程出现时更新线程列表)

  2. 设置线程视图的上次修改时间HTTP标头。 (未设置过期时间,因为有些用户抱怨编辑后页面显示不变)

  3. 部分缓存类别导航片段。(它显示在每个页面的左侧)

  4. 使用htaccess为img / html / css / js设置过期标题。

  5. 考虑了线程列表的数据库sql缓存,但没有完成。我认为它与1相同。

  6. 我还可以做些什么来改善网站效果?

2 个答案:

答案 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中检索它。