asoqa
(Asoqa51)
1
大家好,
我遇到一个CArrayDataProvider翻页的问题。我在index的页面展现一个table的列表,用CGridView渲染,现在问题是:
每次点击翻页,都会重新执行actionIndex方法,在actionIndex中我会调用一个远程接口,这样相当于每次翻页都要调用远程接口,实在是太耗性能了,实际上所有的数据在第一次调用时就已经获取了。
请教如何解决这个翻页问题,让翻页请求不用每次都掉远程接口?
public function actionIndex()
{
//远程调用获取所有tables数据,伪代码
$tables=CallWebService();
$tablesSummary=new CArrayDataProvider($tables, array(
'pagination'=>array(
'pageSize'=>10,
),
));
$this->render('index', array(
'tablesSummary'=>$tablesSummary,
));
}
yiqing95
(Yiqing 95)
2
好像只能通过本地缓存解决
缓存键应该就是 本函数参数或使用的上下文变量做哈希就行(比如
function foo($p){
$userId = Yii::app()->user->getId();
$result = CallWebService($p,$userId);
//...
}
)
上面出现的在环境中的变数:$p $userId 你在设计缓存key时就需要考虑这两个变量 简单的也可以
"methodName".md5($p.$userId); 如果$p 不是字符串 或者其他复杂数据结构那么可以考虑用 var_export()整成一个字符串 在拼接成key
或者把分页数调大些 每次多显示些 。
asoqa
(Asoqa51)
3
谢谢,对yii的缓存方案不熟悉,我现在在看yii缓存的实现。有些通用的数据,可能还要设为全局的缓存。
我想尽可能利用yii已有的功能,再请教一下:
-
CModel是否是通用的数据模型类,也就是我从webservice拿到的数据,是否可以写个类CRemoteModel extends CModel来实现?我看CModel需要覆盖attributesNames这个方法,但貌似这个是没必要的
-
用cache的话,用哪种yii自带的cache比较合适,感觉memcache重了点
hehbhehb
(Hehbhehb)
4
-
如果只是缓存全局数据,用CModel不合适
-
用CFileCache, CMemCache都不错
$rows = Yii::app()->cache->get($cacheKey);
if($rows === false)
{
$rows = getData(...);
Yii::app()->cache->set($cacheKey, $rawData, YII_DEBUG ? 10: 24*3600);
}
asoqa
(Asoqa51)
5
再请教个问题,翻页这种场景下,Yii的AR是怎么进行处理的,难道也是每翻一页都要请求数据库一次,从而依赖于mysql的缓存机制,还是也是自己把结果进行了缓存。