先说一下一般我们在执行大数据操作时,遇到最常见的问题就是:
1、执行超时 参考这里
2、内存溢出 参考这里
看了这两个之后再来看这个方案,实现思路大概是:
- 先利用set_time_limit(0)不限制执行时间
- 将要查询的数据分段查询,每次查询创建一个csv临时文件,每次清空缓冲区
- 数据全部写完之后将所有csv文件合并成一个csv文件
- 合并之后利用zip扩展进行打包下载(如果没有安装此扩展,请先去安装扩展)
- 最后将所有生成的文件删除
/**
* 百万级数据导出
*/
public function bigExport(){
//不限制执行时间,以防超时
set_time_limit(0);
//文件名
$xlsName = '名字'.date('Ymd His');
//统计总行数
$sqlCount = 0;
//表头
$xlsCell = ['列1','列2'];
//对应表头的字段
$fields = 'field1,field2';
//模型,主要使用获取器进行字段值转换
$orderExportModel = new OrderExport();
//统计总行数
$sqlCount = $orderExportModel->count();
//每次取多少条
$sqlLimit = 2000;//每次只从数据库取2000条
// buffer计数器
$cnt = 0;
$fileNameArr = array();