我最近在我的 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,如果我要更新标签或添加新帖子,这将是一场噩梦。
我相信你们中的一个聪明人可以给我一些建议。我不知道如何构建它。