PHP 百万级数据导出方案(多 CSV 文件压缩)
/**
* 导出csv文件
* @param $filename
* @param $data
* @param array $columns
* @param int $chunk 限制每个文件条数
*/
function exportCsv($filename, $data, $columns = [], $chunk = 10000)
{ header('Content-Type: application/csv; charset=UTF-8');
header('Content-Disposition: attachment; filename="' . $filename . '.csv"');
header('Cache-Control: max-age=0'); $storageDir = rtrim(sys_get_temp_dir(), '/');
$prefix = str_random(10); $fileList = []; // 文件集合
$fileList[] = $file = "$storageDir/${prefix}_${filename}_1.csv"; $fp = fopen($file, 'w');
fputs($fp, chr(0xEF) . chr(0xBB) . chr(0xBF));
$head = array_pluck($columns, 'title');
fputcsv($fp, $head); // 计数器
$i = 0;
// 每隔$limit行刷新一下输出buffer,不要太大,也不要太小
$limit = 10000;
// 行上限
$maxLimit = 100000000; foreach ($data as $item) {
if ($i >= $maxLimit) {
break;
} if ($i > 0 && $i % $chunk == 0) {
fclose($fp); // 关闭上一个文件
$j = $i / $chunk + 1;
$fileList[] = $file = "$storageDir/${prefix}_${filename}_$j.csv"; $fp = fopen($file, 'w');
fputs($fp, chr(0xEF) . chr(0xBB) . chr(0xBF));
fputcsv($fp, $head);
} $i++; if ($i % $limit == 0) {
ob_flush();
flush();
} $row = []; foreach ($columns AS $column) {
$value = isset($column['key'])
? (is_object($item) ? $item->{$column['key']} : $item[$column['key']])
: null;
$render = array_get($column, 'render');
if ($render && $render instanceof \Closure) {
$row[] = $render($value, $item);
} else {
if (is_numeric($value) && strlen($value) > 10) {
$value .= "\t";
}
$row[] = $value;
}
} fputcsv($fp, $row);
unset($row);
} fclose($fp);
if (count($fileList) > 1) {
$zip = new ZipArchive();
$oldFilename = $filename;
$filename = "$storageDir/${prefix}_${filename}.zip";
$zip->open($filename, ZipArchive::CREATE); // 打开压缩包 foreach ($fileList as $file) {
$zip->addFile($file, str_replace("${prefix}_", '', basename($file))); // 向压缩包中添加文件
}
$zip->close(); // 关闭压缩包 foreach ($fileList as $file) {
@unlink($file); // 删除csv临时文件
} // 输出压缩文件提供下载
header("Cache-Control: max-age=0");
header("Content-Description: File Transfer");
header('Content-disposition: attachment; filename=' . $oldFilename . '.zip');
header("Content-Type: application/zip"); // zip格式的
header("Content-Transfer-Encoding: binary");
header('Content-Length: ' . filesize($filename));
} else {
$filename = head($fileList);
} @readfile($filename);
@unlink($filename); // 删除临时文件 exit;
}
PHP 百万级数据导出方案(多 CSV 文件压缩)的更多相关文章
- PHP百万级数据导出方案(多csv文件压缩)
本文转自网络仅供学习之用 概述: 最近公司项目要求把数据除了页面输出也希望有导出功能,虽然之前也做过几个导出功能,但这次数据量相对比较大,差不多一天数据就20W条,要求导7天或者30天,那么数据量就轻 ...
- PHP导出数据到CSV文件函数 csv_export()
后台往往需要导出各种数据到 Excel文档中.通常我们是导出 .csv文件格式,PHP导出函数参考代码如下: /** * 导出数据到CSV文件 * * @param array $data 二维数组( ...
- PHP导出数据到CSV文件函数/方法
如果不清楚什么是CSV文件,可看如下文章介绍 CSV格式的是什么文件?CSV是什么的缩写? /** * 导出数据到CSV文件 * @param array $data 数据 * @param arr ...
- PHP导出数据到CSV文件
后台往往需要导出各种数据到 Excel文档中.通常我们是导出 .csv文件格式,PHP导出函数参考代码如下: /** * 导出数据到CSV文件 * * @param array $data 二维数组( ...
- mysql导出数据到csv文件
在日常工作中经常会遇见导出表中的数据到csv文件的操作,这里就简单总结一下导出的操作. 下面对csv文件的描述是摘录: 据RFC4180文档设置的,该文档全称Common Format and MIM ...
- poi实现百万级数据导出
注意使用 SXSSFWorkbook 此类在构造表格和处理行高的时候效率极高,刚开始时我使用的 XSSFWorkbook 就出现构造表格效率极低,一万行基本需要3秒左右,那当导出百万级数据就慢的要死啦 ...
- PHP如何实现百万级数据导出
公司目前有一个需求,需要对一个日增量在20万+数据量的数据表中的数据进行可自定义条件筛选的导出数据,该功能需要对多个部门进行开发使用,要保证功能可用的前提下,尽量优化体验. 首先介绍一下当前可利用的资 ...
- Mysql导出逗号分隔的csv文件
CleverCode在实际的工作中.常常须要将一些报表.或者日志数据等导出来,假设直接做页面,假设次数也不是非常多,需求也不同.所以直接导出csv文件,更加直观. 1 导出csv文件 1.1 语句格式 ...
- 从数据库中导出数据到.csv文件
考虑到csv文件比xls文件格式容易控制,所以在这次导出中用的是.csv格式. protected function exportInfo($arr, &$err){ $nameInfo = ...
随机推荐
- C# 栈 、队列的概念
栈: 也是System.Collections下的数据结构 存储依然是Object类型的对象 Stack 名字 = new Stack(); Count:实际拥有的元素个数 栈的释放顺序是先进后出(后 ...
- 安装ORACLE高可用RAC集群11g执行root脚本的输出信息
安装ORACLE高可用RAC集群11g执行root脚本的输出信息 作者:Eric 微信:loveoracle11g [root@node1 ~]# /u01/app/oraInventory/orai ...
- c# 对DataTable进行分组group by
]);//对索引为0的一列进行分组,结果是集合
- java常量,变量,静态变量的理解
最近考试出了一个很简单的题,看看他们对java常量,变量,静态变量的理解,代码如下: public class TestVar { /** * JAVA基础,常量,变量,静态变量 */ public ...
- 彻底解决COM端口被占用(在使用中)问题的办法
今天就遇到这个问题了串口调试的时候发现usb转串口使用的是COM8而串口调试助手里面只有COM1到4,我想去该COM口发现COM1到7都在使用中,找了好多办法都不行,后面在网上找到这篇解决办法的文章, ...
- CentOS 7 实现ssh无密码登录
cd ~ 进入根目录. (使用ls -a或者 ls -la 能够看到当前文件夹下的所有文件包含隐藏文件夹等) 我们首先使用ls -la 发现并没有.ssh的文件夹存在. 在终端输入 ssh lo ...
- leetcode33
class Solution { public: int search(vector<int>& nums, int target) { //这个题是给一个排序数组,但是数组里面内 ...
- 003之MFCSocket异步编程(指针机制)
002篇是采用传统方式创建,不适应动态的网络环境,服务器为客户端保留着断开连接时的套接字,不够灵活.而采用指针机制不仅可以更加灵活性,而且能使代码更集中,更具有条理性.将其转变成指针机制.功能及运行保 ...
- 37.Spring-事务控制.md
目录 1.分类 2.Spring对jadc事务管理 2.1xml方式 2.1.1首先定义Dao对象和Server对象 2.1.2配置文件实现事务管理 2.2注解方式 2.2.1对象类 2.2.2配置文 ...
- SpringBoot打成jar包的配置方式
pom.xml中添加Springboot插件 <build> <plugins> <plugin> <groupId>org.springframewo ...