0

想问一下
我数据库有十万笔数据
但是我想每两千笔是一个 .csv 档
这能如何实现?
就是一浏览那个网页,就直接下载五十个 csv

email, name
email1, name1
email2, name2.....

以这样的格式往下走到两千
再来就是 2001 ~ 4000以此类推到数据库没有数据为止?
一点头绪也没有...

asys0512 2.7k
2019-03-16 提问
3 个回答
1

已采纳

同意楼上回答 用cli处理模式,防止脚本执行超时
每次读取2000,处理完递归回去 就好了

就类似下面这个

 public function collect($offset, $limit)
    {
        //$offset = 1000;
        $pic = News::offset($offset)->limit($limit)->get(['id','pic'])->toArray();

        if (empty($pic)) {
            echo $this->timeFormat().'执行完成'."\r\n";die;
        }

        foreach ($pic as $item => $value) {
            $id      = $value['id'];
            if(!stripos($value['pic'],'qi-niu')) {
                //$image_address = substr($value['trade_pic'], 1);
                $image_address = $value['pic'];
                if(strlen($image_address) < 8){
                    continue;
                }
                $image_address = $this->public_path().'/uploads'.'/'.$image_address;

                if(!file_exists($image_address)){
                    continue;
                }
                $trade_pic = $this->uploadByQiniu($image_address);

                unlink($image_address);
                DB::table('t_news')->where('id',$id)->update(['pic'=>$trade_pic]);
            }
        }
        echo $this->timeFormat()." || ok\r\n";

        $offset = $offset + $limit;
        usleep(1000);
        $this->collect($offset,$this->limit_num); //递归调用自身
    }
2

首先,数据量过大,不建议直接使用网络请求,因为nginx请求响应有超时时间,使用CLI模式处理更为合理
其次,每读取2000条数据(可以自己for循环,每次循环时,先进行数据库查询,limit,skip处理,查询出来后校验下数据库查询的内容是否为空,为空则break,不为空则往下处理),然后直接使用php的读写文件操作(fopen,fwrite,fclose)即可以操作完成
建议自己按照我刚刚思路进行编写代码,如果有疑问,可以再私密我

1
如果要在网页实现下载的话,建议做成任务方式的,用户提交请求之后,创建一个任务,系统处理之前,用户需要等待,系统处理之后,用户方可下载

系统如何处理

  • 使用定时器方式处理用户任务,不设定超时时间,每次处理一个任务
  • 限定分页为2000条一页,生成对应csv文件到服务器临时目录
  • 10万条数据,生成50个csv文件
  • 将文件打包成压缩文件,移动到指定位置
  • 任务结束,提供相应的下载URL给用户,并提醒用户

撰写答案

推广链接