0

我最近在我的 php yii 网站上添加了一个博客,它是 yii 博客演示的大量修改版本。我的博客使用活动记录,不幸的是,它使用大约 20 次数据库调用来显示帖子。我想用 memcache 加快速度。我想在内存中缓存尽可能多的内容,以摆脱大量的数据库调用。我已经启用了模式缓存,它将调用次数减少到更像 12 或 13,但这仍然太多了。

在对我的博客进行负载测试时,我发现在重负载下我的 CPU 是限制因素。我还有很多内存。所以我希望使用一些额外的内存可以减少我的 cpu 的负载。这就是 memcache 的用武之地。问题是如何构建它。

我已经想出了如何缓存带有评论和标签的单个帖子,这并不是很困难。我正在努力解决的是如何缓存索引页面,每个页面都有许多帖子。第 1 页将有 5 个帖子,第 2 页将有 5 个帖子,等等。我正在像这样进行数据库调用:

           $criteria=new CDbCriteria(array(
                    'condition'=>'status='.Post::STATUS_PUBLISHED,
                    'order'=>'create_time DESC',
                    'with'=>'commentCount',
            ));
            if(!is_null($tag))
                    $criteria->addSearchCondition('tags', $tag);

            $dataProvider=new ActiveDataProvider('Post', array(
                    'pagination'=>array(
                            'pageVar'=>'page',
                            'pageSize'=>5,
                    ),
                    'criteria'=>$criteria,
            ));

            $this->render('index',array(
                    'dataProvider'=>$dataProvider,
            ));

我原本以为我可以只缓存生成的 $dataProvider ,并将查询字符串作为键。我可以得到的东西:

echo http_build_query($criteria->toArray());

我必须将页码附加到该键,但这很容易。但是,这样做意味着我需要为每个页面和每个标签缓存一个单独的 dataProvider,如果我要更新标签或添加新帖子,这将是一场噩梦。

我相信你们中的一个聪明人可以给我一些建议。我不知道如何构建它。

4

1 回答 1

1

在我看来,缓存整个页面或页面的片段是要走的路。

对于缓存整个页面(或动作),yii 提供了COutputCache. 对于片段缓存,有CController::beginCache()CController::endCache()。有关更多信息,请参阅页面缓存片段缓存的文档

关于在内容更改时使缓存失效

来自 yii 文档

除了过期设置,缓存数据也可能会根据一些依赖关系的变化而失效。例如,如果我们正在缓存某个文件的内容并且文件被更改,我们应该使缓存的副本无效并从文件而不是缓存中读取最新的内容。

依赖关系可以由实例CCacheDependency或其子类指定。对于您的特定需要,您可以使用CDbCacheDependencywith sql like

SELECT `update_time` from post where `id`=:id 

用于缓存特定帖子条目的页面。

有关其他可用的依赖类,请参阅文档

于 2012-09-15T07:40:13.413 回答