【发布时间】:2012-09-15 05:05:53
【问题描述】:
我最近在我的 php yii 网站上添加了一个博客,它是 yii 博客演示的一个经过大量修改的版本。我的博客使用活动记录,不幸的是,它使用大约 20 次数据库调用来显示帖子。我想用 memcache 加快速度。我想在内存中缓存尽可能多的内容,以摆脱大量的数据库调用。我已经启用了模式缓存,这将调用次数减少到 12 或 13 次,但这仍然太多了。
在对我的博客进行负载测试时,我发现在重负载下我的 CPU 是限制因素。我还有很多内存。所以我希望使用一些额外的内存可以减少我的 cpu 的负载。这就是 memcache 的用武之地。问题在于如何构建它。
我已经想出了如何使用 cmets 和标签缓存单个帖子,这并不难。我正在努力解决的是如何缓存索引页面,每个页面都有许多帖子。第 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,如果我要更新标签或添加新帖子,这将是一场噩梦。
我相信你们中的一位杰出人士可以给我一些建议。我不知道如何构建它。
【问题讨论】:
-
为什么不缓存整个页面?
-
这就是我要说的。如果我要捕获每个页面,如果我要创建一个新帖子,那么我将不得不使缓存中的所有索引页面以及与标记相同的帖子相关联的任何页面无效。
-
我不认为使缓存失效有什么大不了的。如果您现在有 20 个数据库调用和大量 PHP 代码执行每个页面加载,那么您现在每次有新帖子或新标签时都会拥有它。你得到了很多。
标签: php architecture yii memcached blogs