PHP导出百万大数据【解决方案】

最近开发项目,遇到一个问题,通常导出数据我们都会使用 PHPExcel 来导出数据,但是遇到大数据,这个方法就不行了。

例如:我的项目,3.5W个数据信息,需要导出做数据备份,使用【PHPExcel】来导出就不行了,需要另谋它法:

不考虑PHPExcel就只能考虑导出CSV:

按照一定的数量,例如:5000条,导出CSV文件,多个CSV文件进行压缩为ZIP,最后导出ZIP里面就有所有数据。例如:3.5w条数据,最终有5个CSV文件,生成一个ZIP压缩文件。

代码如下:

public function exportCSV()
{
    $limit = 5000;//每次只从数据库取5000条以防变量缓存太大
    // buffer计数器
    $cnt = 0;
    $xlsTitle = ['序号','姓名','性别'];
    /******************** 调整位置开始 ***************************/
    $sqlCount = 3000; // 这里需要查询出总条数
    /******************** 调整位置结束 ***************************/
    $fileName = iconv('utf-8', 'gb2312', 'students');//文件名称
    $fileName = $fileName . date('_YmdHis');// 文件名称可根据自己情况设定
    $zipname = 'zip-' . $fileName . ".zip";
    // 输出Excel文件头,可把user.csv换成你要的文件名
    header('Content-Type: application/vnd.ms-excel;charset=utf-8');
    header('Content-Disposition: attachment;filename="' . $zipname . '"');
    header('Cache-Control: max-age=0');
    $fileNameArr = array();
    // 逐行取出数据,不浪费内存
    for ($i = 0; $i < ceil($sqlCount / $limit); $i++) {
        $fp = fopen($fileName . '_' . ($i+1) . '.csv', 'w'); //生成临时文件 
        // chmod('attack_ip_info_' . $i . '.csv',777);//修改可执行权限 
        $fileNameArr[] = $fileName . '_' . ($i+1) . '.csv'; // 将数据通过fputcsv写到文件句柄 
        fputcsv($fp, $xlsTitle);
        $start = $i * $limit;
        /******************** 调整位置开始 ***************************/
        $dataArr = $this->model->getList($start,$limit); // 每次查询limit条数据
        /******************** 调整位置结束 ***************************/
        foreach ($dataArr as $a) {
            $cnt++;
            if ($limit == $cnt) {
                // 刷新一下输出buffer,防止由于数据过多造成问题
                ob_flush();
                flush();
                $cnt = 0;
            }
            fputcsv($fp, $a);
        }
        fclose($fp); // 每生成一个文件关闭
    }

    // 进行多个文件压缩
    $zip = new \ZipArchive();
    $zip->open($zipname, $zip::CREATE); // 打开压缩包
    foreach ($fileNameArr as $file) {
        $zip->addFile($file, basename($file)); // 向压缩包中添加文件
    }
    $zip->close();  // 关闭压缩包
    foreach ($fileNameArr as $file) {
        unlink($file); // 删除csv临时文件
    }

    // 输出压缩文件提供下载
    header("Cache-Control: max-age=0");
    header("Content-Description: File Transfer");
    header("Content-Type: application/zip"); // zip格式
    header("Content-Transfer-Encoding: binary");
    header('Content-Length: ' . filesize($zipname));
    @readfile($zipname); // 输出文件
    unlink($zipname); // 删除压缩包临时文件
}

感谢阅读~
留下个宝贵的关注和点赞吧!

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
2022年12月23日星期五 1 高频大数据解决方案 高频大数据解决方案全文共28页,当前为第1页。 电信领域 计费和权限管理,用户数据 个性化营销 广告优化,观众分组 能源与传感器领域 智能电网/电表,资产跟踪与管理,实时交通与地理位置 证券市场 风控管理,市场数据管理 基础设施 数据管道,批次->实时,流媒体的ETL 系统中的高频数据 2 Smart Meter 高度切合领域 高频大数据解决方案全文共28页,当前为第2页。 更快: 读/写 负载 延时/吞吐量 高频大数据解决方案全文共28页,当前为第3页。 电信呼叫数据记录管理 网站数据分析、欺诈侦测 在线游戏小额交易支付 电子广告兑换服务 基于位置的无线服务 金融贸易监控 低频率运行 高频率运行 数据来源 资金市场 写/索引所有交易,存储逐笔交易资料 显示整合交易者的风险 呼叫初始请求 实时授权认可 欺诈侦测分析 入站 HTTP 请求 访问者登陆、分析、警告 流量图形分析 在线游戏 等级分数 定义的间隔执行 玩家 "最好成绩" 排行榜状态查找 实时广告交易系统 匹配形式因素,下单规范,竞价/询价 报告广告效能 无线设备位置感应器 位置更新,服务品质,事物处理 事物处理上的数据分析 VoltDB 应用案例 高频大数据解决方案全文共28页,当前为第4页。 VoltDB应用/方案的高吻合目标行业 行业 电信和网络 金融服务 广告科技 能源和应用 资本市场 电子商务 / 零售业 在线游戏 以上绝不是仅有的行业! 其它行业种类 战略性大数据项目 早期使用者 感应器驱动的环境 高频大数据解决方案全文共28页,当前为第5页。 关键技术特性 ACID全事务支持 灵活的扩展性 错误恢复 可持久化到硬盘 内嵌OLAP 导出连接器 基于网络的异步集群复制 6 高频大数据解决方案全文共28页,当前为第6页。 关键特性: 线性扩展 7 增加一个新结点到VoltDB集群可以有限提升集群的最大吞吐量,也可以增加整个集群的内存容量 集群的大小对应用来说是透明的 高频大数据解决方案全文共28页,当前为第7页。 关键特性: 线性扩展(续) 右边表格源自于独立的测试机构Percona,标示出线性扩展到每秒150万次的运算和最高推断值达到30个服务器。这个表也表明VoltDB线性扩展具备K-Safety 高频大数据解决方案全文共28页,当前为第8页。 关键特性: 内置异常恢复/HA功能 9 分区就是复制的单位 事务复制操作(不是更改记录)使用Active/Active 同步复制方式 应用只有在所有复制节点都提交(或者回滚)后才会收到成功(或者失败)的响应 高频大数据解决方案全文共28页,当前为第9页。 关键特性: 基于网络的数据库集群复制 10 VoltDB包括一个网络复制Agent 这个Agent将事物异步从主集群(可读可写)复制到备集群(只读) 异步的方式最大限度容忍网络可能出现的问题 高频大数据解决方案全文共28页,当前为第10页。 整合:高性能导出 并行导出 接近最大线速 基于事先建立的连接 Hadoop CSV JDBC (PostgreSQL, MySQL, Oracle) Netezza Vertica VoltDB 建立了一个基于事务的,可持久化的导出框架 在VoltDB完成高质量、实时分析、实时响应,并把结果数据通过VoltDB Export导出到OLAP 高频大数据解决方案全文共28页,当前为第11页。 VoltDB管理和监控 Nagios 脚本 Logs to Log4j JMX VoltDB 企业管理器 每一个节点都有一个内置网络服务器 特殊的系统程序 高频大数据解决方案全文共28页,当前为第12页。 VoltDB的一个典型架构 ERP CRM HR Orders Cart Recom-mendation User Mgt. Click Stream Inv Personal-ization Data warehouse Hadoop Traditional OLTP Velocity OLTP logins sensors impressions orders authorizations clicks trades Interactive Real-time Analytics Historical Analytics Exploratory Analytics Analytic results enrich decision making 高频大数据解决方案全文共28页,当前为第13页。 使用方案中会包含VoltDB的目标客户 理想的销售机会Ideal Prospect Characteristics 初期采用者 高速率-增长中的交易处理率 寻求竞争差异 事务处理 – 需要做出决策
当需要导出大量数据时,使用SQLPlus可能会遇到一些限制,例如内存限制或输出文件大小限制。为了解决这些问题,可以采用以下方法导出大数据: 1. 使用分页查询:通过在SELECT语句中使用ROWNUM和分页查询来限制每次查询的数据量。例如,使用以下语句分页查询数据: ``` SELECT * FROM ( SELECT ROWNUM AS rn, t.* FROM 表名 t ) WHERE rn BETWEEN start_row AND end_row; ``` 其中,start_row和end_row是每个分页的起始行和结束行。 2. 使用批处理查询:将大的查询任务划分为多个小的查询任务,并逐个执行。例如,使用一个脚本文件或程序来循环执行多个查询并将结果保存到不同的输出文件中。 3. 使用工具或脚本:除了SQLPlus,还可以考虑使用其他数据库工具或编写脚本来导出大数据。例如,使用Oracle Data Pump工具(expdp)或使用编程语言(如Python)连接数据库并执行查询并将结果保存到文件中。 4. 增加内存和临时表空间:如果SQLPlus在导出大数据时遇到内存或临时表空间不足的问题,可以尝试增加内存和临时表空间的限制。可以通过修改数据库参数或与数据库管理员协商来进行设置。 5. 考虑压缩输出文件:如果导出的数据量非常大,可以考虑在导出时使用压缩选项,例如使用gzip或zip等工具对输出文件进行压缩,以减小文件大小。 请注意,在导出大量数据时,需要确保有足够的磁盘空间来存储输出文件,并且导出过程可能需要一些时间。此外,根据具体情况,可能需要与数据库管理员或相关团队进行进一步的讨论和调整。 希望以上信息对你有所帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员-南

你的鼓励将是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值