有很多app,你刷新时每次都会加载新的内容,就好像永远刷不完一样。而不是像一般我们做的翻页,按照第1,2,3页这样加载数据,自己想了一个方法,仅供参考。
$page = $_GET['page']?:1;
$uniqueNo = str_replace(".","_",getIp())."_".getDeviceid;//生成一个用户唯一标识
if ($page == 1){
cache("loadPage_".$cate."_".$uniqueNo,null);//如果是第一页,清空已加载页码缓存,$cate表示列表查询时需要的参数,针对特定条件查询生成已加载页码缓存
}
$loadPage = cache("loadPage_".$cate."_".$uniqueNo)?:[];//取出已加载过的页码 是一个数组
$count = Db::name(tablename)->where($where)->cache(1800)->count();//查询符合条件的总数据量
$limit = 10;
$totalPage = ceil($count/$limit);//计算出总页数
$page = getRandPage($totalPage,$loadPage,$page);
if(!$page){//说明数据加载完
$list = [];
}else{
//正常业务处理
$start = ($page-1)*$limit;
$list = Db::name(tablename)->where($where)->limit($start,$limit)->select();
.
.
.
//将当前页码加入到已加载页码缓存中
array_push($loadPage,$page);
cache("loadPage_".$cate."_".$uniqueNo,$loadPage,1800);
}
/**
* @param $totalPage 总页数
* @param $usedPage 已加载过的页码数组
* @param int $isFirst 是否第一页
* @return bool|int
*/
function getRandPage($totalPage,$usedPage,$isFirst = 1){
//如果只有1页
if($totalPage == 1 && $isFirst==1){
return 1;
}
//如果可用页码已取完,返回false,说明数据已结束
if(count($usedPage) >= $totalPage){
return false;
}
//如果是第一次翻页,去掉最后一页 防止用户在第一次加载时取到最后一个页码,而最后一页数据量又不满一页(如:10条)的情况,造成后续不能翻页
if($isFirst == 1){
$randPage = rand(1,$totalPage-1);
}else{
$randPage = rand(1,$totalPage);
}
if(!in_array($randPage,$usedPage)){
return $randPage;
}else{
return getRandPage($totalPage,$usedPage,$isFirst);
}
}
以上方法也有一个缺点,就是当用户翻了很多页之后,已加载页码缓存数组中会有很多个元素,在使用getRandPage函数获取随机未使用的页码时,随机产生的页码可能会存在已加载页码缓存数组中,这样就要再循环一次,多次循环可能会产生一些耗时问题。