2

我已经使用 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相同。

我还能做些什么来提高网站性能?

4

2 回答 2

5

我假设您已经完成了性能调优指南第 1 点和第 3 点。这真的很有帮助。

对于数字 2,您可以使用CHttpCacheFilter

类 CategoryController 扩展控制器 {

   私人 $_categoryLastUpdate;
   公共功能过滤器(){
      返回数组(
         大批(
           'CHttpCacheFilter + 视图',
           'cacheControl' => " max-age=604800, 必须重新验证",
           'etagSeedExpression' => 函数() {
             返回 $this->getCategoryLastUpdate();
           }
           'lastModifiedExpression' => 函数() {
             返回 $this->getCategoryLastUpdate();
           }
         )
      )
   }

   公共函数 actionView($id){
      $object = Category::model()->findByPk($_GET['id']);
      $this->render('view', array('object' => $object));
   }

   公共函数 getCategoryLastUpdate(){
      if (!isset($this->_categoryLastUpdate)){
         $obj = Category::model()->findByPk($_GET['id'], array('select' => 'lastUpdate'));
         $this->_categoryLastUpdate
      }
      返回 $this->_categoryLastUpdate;
   }

}

它基本上会按类别计算 ETag 和 LastUpdate。而要保存查询,它会首先只计算对象lastUpdate的。Category

对于第一,您始终可以使用CCacheDependency。只需在线程列表对象中创建一个字段,例如lastUpdate. 当一个新线程提交时,只需更新该字段并将其用于 CCacheDependency。

由于我看到您使用了非常大的分页,因此我认为您想阅读有关优化分页显示的四种方法(如果您将 MySQL 用于数据库和线程搜索/列表)。

于 2013-02-22T08:48:57.317 回答
0

尝试将缓存管理器与 Memcache 或 APC 一起使用。例如,http://code.google.com/p/memcache-flag/。当您编辑列表时,您可以使缓存项或标签无效。我想如果您的设计很简单(设置一个键并在它不再有效时将其删除),它也可以使用常规的 APC / Memcache 函数来完成。

使用它来存储序列化(或自动序列化)数据,而不是从 mysql 中检索它。

于 2013-02-22T01:20:56.450 回答