php 数组导出csv_php导出百万数据到csv

先看代码:

set_time_limit(0); // 设置超时

ini_set('memory_limit', '100M'); // 设置最大使用的内存

header("Content-type:text/csv");

header("Content-Disposition:attachment;filename=" . date('Ymd'). '.csv');

header('Cache-Control:must-revalidate,post-check=0,pre-check=0');

header('Expires:0');

header('Pragma:public');

$out = fopen('php://output', 'w');

$bom = chr(0xEF).chr(0xBB).chr(0xBF); // 防止乱码

$func = function ($list){

$arr = [];

foreach ($list as $v){

$arr[$v['id']] = $v['name']

}

return $arr;

}

// todo 注意我这里都是用sql语句直接代替查询

$list = select * from area;

$area = $func($list);

$list = select * from greate;

$greate = $func($list);

$list = select * from School;

$School = $func($list);

ob_end_clean();

ob_implicit_flush(5);

fputcsv($out, [$bom . '学生编号','学生姓名','所属区域','所属年级','所属学校']);

// 上面整理好了对应关系

do{

$i = 0;

$list = select * from student where id > $i order by id asc limit 10000

if(!$list) break;

foreach($list as $v){

if($v['id'] > $i) $i = $v['id']; // 这里可以不这样写,这些就自己优化吧

fputcsv($out, [

$v['student_no'],$v['name'],

$area[$v['areaId']],

$greate[$v['gradeId']],

$School[$v['SchoolId']],

]);

}

}while(true)

fclose($out);

exit();起因:有一次业务需求,需要导出数据库中的所有数据给接口下游,以便下游比对所有数据是否一致。这时候数据库中已经有将近100+万数据。下游希望要的数据并不是数据库的格式,格式特定样式的。这时候就需要关联上好多个表进行同时查询。

最开始我是使用orm模式进行处理导对应字段,导出的数据(我做了redis缓存),整个导出过程用了半天。

用phpAdmin联合查询导出数据的时候用了不到3分钟;

思考jion与orm用哪个

用orm为什么慢

用orm是否也可以很快

先说今天的主题假设现在有一个天津市学生表(有100+万数据)

student table

area table (15条数据)

greate table (12条数据)

School table (100+条数据)

要求导出所有内容到csv文件中 格式要求:学生编号,学生姓名,所属区域,所属年级,所属学校

以上内容希望帮助到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,需要PHP进阶架构师>>>视频、面试文档免费获取​docs.qq.com

或 者关注咱们下面的知乎专栏PHP大神进阶​zhuanlan.zhihu.com

来源“https://www.cnblogs.com/yszr/p/11976556.html”

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值