为了实验大数据的导出,我们这里先自已创建一张大表,表结构如下:

CREATE TABLE `tb_users` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '用户ID',`name` varchar(32) DEFAULT '' COMMENT '用户名',`age` tinyint(3) DEFAULT '0' COMMENT '用户年龄',`desc` varchar(255) DEFAULT '' COMMENT '用户描述',`phone` varchar(11) DEFAULT '' COMMENT '用户手机',`qq` varchar(16) DEFAULT '' COMMENT '用户QQ',`email` varchar(64) DEFAULT '' COMMENT '用户邮箱',`addr` varchar(255) DEFAULT '' COMMENT '用户地址',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

然后写个php脚本往这个表插入数据,代码如下:

<?php
set_time_limit(0);
ini_set('memory_limit', '128M');//使用TP3.2的String类,php7下会报错,注意把类名换一下
require './String.class.php';
use Org\Util\NewString;$begin = microtime(true);$db = new mysqli('127.0.0.1', 'root', '', 'test');if($db->connect_error) {die('connect error');
}
//数据插入语句
$insSql = '';//一百万数据,分200步,每步插入5000条
$step = 200;
$nums = 5000;for($s = 0; $s < $step; ++$s) {$insSql = 'INSERT INTO tb_users VALUES';for($n = 0; $n < $nums; ++$n) {$name = NewString::randString(3, 4);$age = mt_rand(1, 120);$desc = NewString::randString(64, 4);$phone = NewString::randString(11, 1);$qq = NewString::randString(13, 1);$email = $qq . '@qq.com';$addr = NewString::randString(128, 4);$insSql .= "(NULL, '{$name}', $age, '{$desc}', '{$phone}', '{$qq}', '{$email}', '{$addr}'),";}$insSql = rtrim($insSql, ',');$db->query($insSql);
}
$end = microtime(true);
echo '用时:', $end - $begin;$db->close();

里面用到的TP3.2的String类大家自行上TP官网下载。整个用时2个多小时,最后数据大小662M。

现在我们用php提供的fputcsv来导出这一百万的数据,原理就是打开一个标准输出流,然后把数据按一万条来分割,每一万条就刷新缓冲区。

<?php
set_time_limit(0);
ini_set('memory_limit', '128M');$fileName = date('YmdHis', time());
header('Content-Type: application/vnd.ms-execl');
header('Content-Disposition: attachment;filename="' . $fileName . '.csv"');$begin = microtime(true);//打开php标准输出流
//以写入追加的方式打开
$fp = fopen('php://output', 'a');$db = new mysqli('127.0.0.1', 'root', '', 'test');if($db->connect_error) {die('connect error');
}//我们试着用fputcsv从数据库中导出1百万的数据
//我们每次取1万条数据,分100步来执行
//如果线上环境无法支持一次性读取1万条数据,可把$nums调小,$step相应增大。
$step = 100;
$nums = 10000;//设置标题
$title = array('ID', '用户名', '用户年龄', '用户描述', '用户手机', '用户QQ', '用户邮箱', '用户地址');
foreach($title as $key => $item) {$title[$key] = iconv('UTF-8', 'GBK', $item);
}
//将标题写到标准输出中
fputcsv($fp, $title);for($s = 1; $s <= $step; ++$s) {$start = ($s - 1) * $nums;$result = $db->query("SELECT * FROM tb_users ORDER BY id LIMIT {$start},{$nums}");if($result) {while($row = $result->fetch_assoc()) {foreach($row as $key => $item) {//这里必须转码,不然会乱码$row[$key] = iconv('UTF-8', 'GBK', $item);}fputcsv($fp, $row);}$result->free();//每1万条数据就刷新缓冲区ob_flush();flush();}
}$end = microtime(true);
echo '用时:', $end - $begin;

整个过程用时5分钟,最终生成的csv文件大小420M。

对于如何用phpexcel导出大数据,并没有什么比较好的方案,phpexcel提供的一些缓存方法,数据压缩,虽然内存使用小了,但所用时间则加长了,时间换空间,显然并不是最好的方案。比较靠谱的方法还是生成多个下载链接地址,把你要下载的数据,以get形式传递当前页数,后台进行数据分页然后导出。

<a href="/downSearchData.php?参数1=值1&参数2=值2&page=1">下载汇总结果1</a>
<a href="/downSearchData.php?参数1=值1&参数2=值2&page=2">下载汇总结果2</a>
<a href="/downSearchData.php?参数1=值1&参数2=值2&page=3">下载汇总结果3</a>

比如你有一个查询数据表单,ID为searchFrm,然后你想把导出数据按1万条分割(phpexcel一次导出1万条是没有问题的,效率还行)

<form id="searchFrm">姓名<input type="text" name="uname"><input type="button" id="searchDataBtn" value="导出汇总结果">
</form>
<div id="searchDataList"></div><script type="script">$("#searchDataBtn").on("click", function() {var params = $("#searchFrm").serialize();//获取查询数据的条数$.get("/getSearchDataRows?" + params, function(data) {var downDataList = "";if(data["rows"]) {//rows是数据总条数,pageSize是一页多少条var pageNum = Math.ceil(data["rows"] / data["pageSize"]);for(var i = 1; i <= pageNum; ++i) {downDataList += "<a href='/downSearchData.php?'" + params + "&page=" + i + ">下载汇总结果" + i + "</a>&nbsp;&nbsp;";}$("#searchDataList").html(downDataList);} else {$("#searchDataList").text("没有数据");}}, "json");return false;});
</script>

php使用fputcsv进行大数据的导出相关推荐

  1. 关于php使用fputcsv进行大数据的导出

    为了实验大数据的导出,我们这里先自已创建一张大表,表结构如下: CREATE TABLE `tb_users` (`id` int(11) unsigned NOT NULL AUTO_INCREME ...

  2. java百万级大数据量导出

    java实现百万级大数据量导出 实现方式一 一,分析 excel导出如果数据量过大,会出现两个内存溢出的问题 查绚数据量过大,导致内存溢出(可通过分批查绚解决) 下载的时候大EXCEL转换的输出流内存 ...

  3. java大数据量导出csv文件并压缩

    java大数据量导出csv文件并压缩 java使用POI大数据量导出excel一般会存在以下几个问题: 一次从数据库查询出这么大数据,查询缓慢 查询数据量过大时会内存溢出 解决方案:分页查询数据,比如 ...

  4. EasyExcel 分Sheet实现大数据量导出

    EasyExcel 分 Sheet 实现大数据量导出 [场景]平台用户导出数据量达 w 级别的数据时界面白屏或按钮无响应. [解决方案]做异步导出,用户触发点击时创建导出消息并开启单独线程处理导出,处 ...

  5. 大数据导出excel大小限制_大数据量导出Excel的方案

    测试共同条件: 数据总数为110011条,每条数据条数为19个字段. 电脑配置为:P4 2.67GHz,1G内存. 一.POI.JXL.FastExcel比较 POI.JXL.FastExcel均为j ...

  6. 大数据导出excel大小限制_EXCEL大数据量导出的解决方案

    将web页面上显示的报表导出到excel文件里是一种很常见的需求.润乾报表的类excel模型,支持excel文件数据无失真的导入导出,使用起来非常的方便.然而,当数据量较大的情况下,excel本身的支 ...

  7. 使用bcp进行大数据量导出导入

    SQL Server的导出导入方式有:在SQL Server中提供了导入导出的界面操作. --还没有解决的问题  --1:使用BCP命令时如果导出的字段为空想替换为其它描述(比如替换成NULL)如何办 ...

  8. EasyExcel3.0.5 解决大数据导入导出,防止OOM

    文章目录 前言 源码 代码实现 POM 依赖 application.yaml Application 启动类 Config 相关配置类 创建员工信息表 导入和导出实体 Controller 层 Se ...

  9. 大数据量导出Excel ---待测试

    set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go /*--数据导出EXCEL 导出查询中的数据到Excel,包含字段名,文件为真正的Excel文件 如果文件不 ...

最新文章

  1. Linuxnbsp;Oracle服务启动amp;停止脚本与开机自启动
  2. Python:基础操作(2)
  3. 在hive的beeline下,Error: org.apache.thrift.transport.TTransportException: java.net.SocketException: Bro
  4. 【SPOJ 694】Distinct Substrings (更直接的求法)
  5. 7-2 单源最短路径 (10 分)(思路+详解+邻接表做法)Come Brather!!!!!!!!!!
  6. 【NOI2019】斗主地【期望】【组合数学】【下降幂】【插值】
  7. 2020牛客国庆集训派对day1 Zeldain Garden
  8. css加了固定定位就不显示内容_前端开发必备,学好”定位“向菜鸟说拜拜
  9. C语言 ,嵌入式 ,c++,数据结构 面试题目(4)
  10. 备份Linux系统的数据到坚果云
  11. ubuntu 修改ip后,老ip仍然存在的问题
  12. Webstorm返回上一步操作快捷键 格式化代码快捷键
  13. 拼多多2018校招—小熊吃糖
  14. 6JS库-前端框架(库)-jQuery选择器
  15. SpringBoot中Mybatis-plus的通用接口BaseMapper方法演示(上)
  16. 关于The C10K problem的一些资料
  17. 求二维数组的行列大小(C语言)
  18. imo班聊未读消息提示优化
  19. JavaWeb——grid布局
  20. 使用element ui + vue时出现vue.runtime.esm.js:1737 TypeError: Cannot read property ‘$options‘ of undefined

热门文章

  1. access labsql 出错_一段由ACCESS转为SQL SERVER后出现的CINT错误
  2. python末位1的位置_用Python黑了整个学院学姐的电话和QQ,爬虫牛皮!兄弟们耗子尾之!...
  3. MySQL(三)——函数、事务(ACID)、索引、权限管理和备份、数据库三大范式
  4. git 如何清理操作日志_git如何清空所有的commit记录
  5. AXI4-Lite协议详解
  6. 浅谈C/C++引用和指针的联系和区别
  7. VC资源分配、释放表
  8. php320,PHP_PHP正式版-320mp3下载站
  9. bootstrap 右对齐样式_Bootstrap的文本处理
  10. linux内核mtd分区,linux-kernel – ubifs卷与mtd分区