PHP快速导出百万级数据到CSV或者EXCEL文件


Posted in PHP onNovember 27, 2020

前言: 很多时候,因为数据统计,我们需要将数据库的数据导出到Excel等文件中,以供数据人员进行查看,如果数据集不大,其实很容易;但是如果对于大数集的导出,将要考虑各种性能的问题,这里以导出数据库一百万条数据为例,导出时间不过20秒,值的学习的一种大数据导出方式。

一、导出思路

  • 需要考虑服务器内存
  • 需要考虑程序运行的最大时间
  • 缺少BOM头导致乱码的处理
  • 如果导出数量过大,推荐使用循环导出,每次循环这里以导出一万条为例,循环100次即可全部导出

二、导出源码

  • 下面源码将数据库信息修改成自己的即可使用
  • 亲测导出一百万条数据,3个字段,不过20秒
  • 如果服务器硬件不支持一次读取一万条数据,可将循环次数提高,导出数量降低
<?php
  //让程序一直运行
  set_time_limit(0);
  //设置程序运行内存
  ini_set('memory_limit', '128M');
 
  $fileName = '测试导出数据';
  header('Content-Encoding: UTF-8');
  header("Content-type:application/vnd.ms-excel;charset=UTF-8");
  header('Content-Disposition: attachment;filename="' . $fileName . '.csv"');
  
  //打开php标准输出流
  $fp = fopen('php://output', 'a');
 
  //添加BOM头,以UTF8编码导出CSV文件,如果文件头未添加BOM头,打开会出现乱码。
  fwrite($fp, chr(0xEF).chr(0xBB).chr(0xBF));
  //添加导出标题
  fputcsv($fp, ['姓名', '年龄', '地区']);
  
  //链接数据库
  $dsn = "mysql:host=127.0.0.1;port=3306;dbname=db_www;charset=utf8";
  $pdo = new PDO($dsn, 'root', '');
 
  $step = 100; //循环次数
  $nums = 10000; //每次导出数量
 
  for($i = 0; $i < $step; $i++) {
    $start = $i * 10000;
    $sql = "SELECT uname,age,city FROM `hd_test` ORDER BY `id` LIMIT {$start},{$nums}";
    $pdostatement = $pdo->query($sql);
    $result = $pdostatement->fetchAll(PDO::FETCH_ASSOC);
    foreach ($result as $item) {
      fputcsv($fp, $item);
    }
    //每1万条数据就刷新缓冲区
    ob_flush();
    flush();
  }

三、快速生成百万条测试数据

这里推荐数据库的蠕虫复制命令
先建好表后,插2条测试数据后,执行几次下列命令,即可指数增长

INSERT INTO hd_test (uname,age,city) SELECT uname,age,city FROM hd_test;

到此这篇关于PHP快速导出百万级数据到CSV或者EXCEL文件的文章就介绍到这了,更多相关PHP 导出百万级数据内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

PHP 相关文章推荐
php&amp;java(三)
Oct 09 PHP
php产生随机数的两种方法实例代码 输出随机IP
Apr 08 PHP
用PHP和Shell写Hadoop的MapReduce程序
Apr 15 PHP
浅谈php冒泡排序
Dec 30 PHP
php使用类继承解决代码重复的问题
Feb 11 PHP
PHP7之Mongodb API使用详解
Dec 26 PHP
Symfony的安装和配置方法
Mar 17 PHP
PHP合并数组的2种方法小结
Nov 24 PHP
yii2项目实战之restful api授权验证详解
May 20 PHP
php写一个函数,实现扫描并打印出自定目录下(含子目录)所有jpg文件名
May 26 PHP
PHP实现模拟http请求的方法分析
Dec 20 PHP
PHP7内核CGI与FastCGI详解
Apr 14 PHP
php实现JWT验证的实例教程
Nov 26 #PHP
PHP替换Word中变量并导出PDF图片的实现方法
Nov 26 #PHP
PHP扩展安装方法步骤解析
Nov 24 #PHP
Cookie跨域问题解决方案代码示例
Nov 24 #PHP
PHP执行linux命令6个函数代码实例
Nov 24 #PHP
PHP获取真实IP及IP模拟方法解析
Nov 24 #PHP
Thinkphp极验滑动验证码实现步骤解析
Nov 24 #PHP
You might like
php验证手机号码(支持归属地查询及编码为UTF8)
2013/02/01 PHP
php实现与erlang的二进制通讯实例解析
2014/07/23 PHP
php检查页面是否被百度收录
2015/10/28 PHP
PHP判断JSON对象是否存在的方法(推荐)
2016/07/06 PHP
Thinkphp和Bootstrap结合打造个性的分页样式(推荐)
2016/08/01 PHP
如何离线执行php任务
2017/02/21 PHP
基于JQuery的Pager分页器实现代码
2010/07/17 Javascript
使用Jquery搭建最佳用户体验的登录页面之记住密码自动登录功能(含后台代码)
2011/07/10 Javascript
jQuery中对未来的元素绑定事件用bind、live or on
2014/04/17 Javascript
jQuery判断浏览器并动态调整select宽度的方法
2016/03/02 Javascript
js多功能分页组件layPage使用方法详解
2016/05/19 Javascript
Vue.js学习之计算属性
2017/01/22 Javascript
JS实现本地存储信息的方法(基于localStorage与userData)
2017/02/18 Javascript
使用JS在浏览器中判断当前网络连接状态的几种方法
2017/05/05 Javascript
es6中的解构赋值、扩展运算符和rest参数使用详解
2017/09/28 Javascript
vue单页应用加百度统计代码(亲测有效)
2018/01/31 Javascript
vue2.0+vue-dplayer实现hls播放的示例
2018/03/02 Javascript
vue2.0 computed 计算list循环后累加值的实例
2018/03/07 Javascript
JS实现图片转换成base64的各种应用场景实例分析
2018/06/22 Javascript
vue接入腾讯防水墙代码
2019/05/07 Javascript
vue 在methods中调用mounted的实现操作
2020/08/07 Javascript
vue a标签点击实现赋值方式
2020/09/07 Javascript
[01:02:53]DOTA2上海特级锦标赛主赛事日 - 5 总决赛Liquid VS Secret第二局
2016/03/06 DOTA
[00:19]CN DOTA NEVER DIE!VG夺冠rOtK接受采访
2019/12/23 DOTA
python之模拟鼠标键盘动作具体实现
2013/12/30 Python
python实现超简单端口转发的方法
2015/03/13 Python
python 3.3 下载固定链接文件并保存的方法
2018/12/18 Python
python使用turtle绘制国际象棋棋盘
2019/05/23 Python
django认证系统实现自定义权限管理的方法
2019/08/28 Python
将matplotlib绘图嵌入pyqt的方法示例
2020/01/08 Python
用python读取xlsx文件
2020/12/17 Python
有关HTML5 Video对象的ontimeupdate事件(Chrome上无效)的问题
2013/07/19 HTML / CSS
进步之星获奖感言
2014/02/22 职场文书
入党积极分子评语
2014/05/04 职场文书
平面设计师岗位职责
2014/09/18 职场文书
离职员工给领导和同事的感谢信
2015/11/03 职场文书