前言
在php开发中经常有处理大量数据的需求,但是单次读出太大数据再遍历报内存溢出报错,用
ini_set('memory_limit','-1');
可以避免报错,但是页面加载会很慢。很多时候也不能解决问题。
解决思路
- 给数据库中每条记录加上一个处理状态的字段
status = 0
。【0=>表示未处理,1=>表示已处理】 - 分批按
status = 0
条件查询数据并处理,处理完成修改记录status = 1
。 - 浏览器挂机执行即可。
应用场景
- 需要定时处理的各种需求,比如结算。
- 处理大量数据时服务器跑不动的情况。
实现代码
public function test(){
// ini_set('memory_limit','-1');//设置脚本内存限制 -1表示不限制
// set_time_limit(0);//设置最大脚本运行时间 0为不限制
$User = M("User"); // 实例化User对象
$user = $User->where('status=0')->limit(0,1)->select(); //定义查询条件 通过limit来限制每次处理条数
if(!empty($user)){
foreach($invest as $i){
/*
这里编写处理数据代码
*/
$User->where('id='.$i['id'])->setField('status',1);//修改该记录处理状态
}
}else{
echo '处理完成';
}
//这里控制每次执行时间 浏览器自动刷新执行下一批数据
$url = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'] . '?' . $_SERVER['QUERY_STRING'];
echo '<script type="text/javascript">
setInterval(refresh,1000)
function refresh(){
window.location.href = "' . $url . '";
}
</script>';
}