前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Thinkphp5 分批批量导出百万条数据记录的Code,不用PHPEXCEL哦!

Thinkphp5 分批批量导出百万条数据记录的Code,不用PHPEXCEL哦!

作者头像
程序猿的栖息地
发布2022-04-29 15:18:31
1.1K0
发布2022-04-29 15:18:31
举报
文章被收录于专栏:程序猿的栖息地

通过phpexcel导出上万条数据,会延迟、内存溢出、程序报错,各种问题出现...届时作者放弃了phpexcel,导出小数据量还是很可行的。下面通过分批导出csv,并压缩至zip中提供下载...废话不说上代码...部分代码参考网上的哦~~~

问题:通过phpexcel导出上万条数据,会延迟、内存溢出、程序报错,各种问题出现...届时作者放弃了phpexcel,导出小数据量还是很可行的。下面通过分批导出csv,并压缩至zip中提供下载...废话不说上代码...部分代码参考网上的哦~~~ fans_list 方法为作者自己封装的方法,可根据自己的情况来写,其实就是根据参数返回数据集而已。

代码语言:javascript
复制
/**
 * csv 批量导出
 * @param $mpid
 * @throws \think\db\exception\DataNotFoundException
 * @throws \think\db\exception\ModelNotFoundException
 * @throws \think\exception\DbException
 */
public function export($mpid)
{
    $wechat_mp_model = new WechatMp();

    $limit = 50000;//每次只从数据库取50000条以防变量缓存太大
    // buffer计数器
    $cnt = 0;

    $where['mpid'] = $mpid;
    $mpName = $wechat_mp_model->getCustomField($where, 'mpname');
    $start_time = $this->request->param('start_time', '');
    $end_time = $this->request->param('end_time', '');
    $args['start_time'] = $start_time;
    $args['end_time'] = $end_time;
    $xlsTitle = ['关注时间', '微信Openid', '微信昵称', '微信头像', '性别'];

    set_time_limit(0);

    $sqlCount = $this->get_fans_list($mpid, 0, $limit, $args, true);
    $fileName = iconv('utf-8', 'gb2312', $mpName);//文件名称
    $fileName = $fileName . date('_YmdHis');// 文件名称可根据自己情况设定
    // 输出Excel文件头,可把user.csv换成你要的文件名
    header('Content-Type: application/vnd.ms-excel;charset=utf-8');
    header('Content-Disposition: attachment;filename="' . $fileName . '"');
    header('Cache-Control: max-age=0');

    $fileNameArr = array();
    // 逐行取出数据,不浪费内存
    for ($i = 0; $i < ceil($sqlCount / $limit); $i++) { 

        $fp = fopen($fileName . '_' . $i . '.csv', 'w'); //生成临时文件 
        // chmod('attack_ip_info_' . $i . '.csv',777);//修改可执行权限 
        $fileNameArr[] = $fileName . '_' . $i . '.csv'; // 将数据通过fputcsv写到文件句柄 
        fputcsv($fp, $xlsTitle); 
        $start = $i * $limit; 
        $dataArr = $this->get_fans_list($mpid, $start, $limit, $args);
        foreach ($dataArr as $a) {
            $cnt++;
            if ($limit == $cnt) {
                //刷新一下输出buffer,防止由于数据过多造成问题
                ob_flush();
                flush();
                $cnt = 0;
            }
            fputcsv($fp, $a);
        }
        fclose($fp);  //每生成一个文件关闭
    }
    //进行多个文件压缩
    $zip = new \ZipArchive();
    $filename = $fileName . ".zip";
    $zip->open($filename, $zip::CREATE);   //打开压缩包
    foreach ($fileNameArr as $file) {
        $zip->addFile($file, basename($file));   //向压缩包中添加文件
    }
    $zip->close();  //关闭压缩包
    foreach ($fileNameArr as $file) {
        unlink($file); //删除csv临时文件
    }
    $this->insertLog($this->admin_id, '', '导出公众号粉丝');
    //输出压缩文件提供下载
    header("Cache-Control: max-age=0");
    header("Content-Description: File Transfer");
    header('Content-disposition: attachment; filename=' . basename($filename)); // 文件名
    header("Content-Type: application/zip"); // zip格式的
    header("Content-Transfer-Encoding: binary"); //
    header('Content-Length: ' . filesize($filename)); //
    @readfile($filename);//输出文件;
    unlink($filename); //删除压缩包临时文件
}

目前本机没有百万数据,也就30万条左右,导出没有任何问题,而且效率杠杠的。大家在使用过程中有更好的建议,欢迎留言!!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序猿的栖息地 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档