请教Carraydataprovider翻页问题

大家好,

我遇到一个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,

                ));

}



好像只能通过本地缓存解决 :lol: 缓存键应该就是 本函数参数或使用的上下文变量做哈希就行(比如

function foo($p){

     $userId = Yii::app()->user->getId();


     $result = CallWebService($p,$userId);


    //...

}

上面出现的在环境中的变数:$p $userId 你在设计缓存key时就需要考虑这两个变量 简单的也可以

"methodName".md5($p.$userId); 如果$p 不是字符串 或者其他复杂数据结构那么可以考虑用 var_export()整成一个字符串 在拼接成key

或者把分页数调大些 每次多显示些 。

谢谢,对yii的缓存方案不熟悉,我现在在看yii缓存的实现。有些通用的数据,可能还要设为全局的缓存。

我想尽可能利用yii已有的功能,再请教一下:

  1. CModel是否是通用的数据模型类,也就是我从webservice拿到的数据,是否可以写个类CRemoteModel extends CModel来实现?我看CModel需要覆盖attributesNames这个方法,但貌似这个是没必要的

  2. 用cache的话,用哪种yii自带的cache比较合适,感觉memcache重了点

  1. 如果只是缓存全局数据,用CModel不合适

  2. 用CFileCache, CMemCache都不错




$rows = Yii::app()->cache->get($cacheKey);

if($rows === false)

{	

    $rows = getData(...);

    Yii::app()->cache->set($cacheKey, $rawData, YII_DEBUG ? 10: 24*3600);			

}




再请教个问题,翻页这种场景下,Yii的AR是怎么进行处理的,难道也是每翻一页都要请求数据库一次,从而依赖于mysql的缓存机制,还是也是自己把结果进行了缓存。