大文件导出导致超时?TP5.1 使用 CSV 流式输出避免内存溢出【Excel】

小枫吖_7245

小枫吖_7245

2026-07-10

160人浏览

原创

tp5.1大数据导出必须用cursor()流式查询+手动fputcsv输出csv,禁用db::select()和excel导出。需输出bom、正确响应头、清缓冲、显式字段、过滤大字段,并严格控制字段顺序与空值处理。

大文件导出导致超时?tp5.1 使用 csv 流式输出避免内存溢出【excel】

超时不是 PHP 配置没调够,而是你还在用 Db::select() 查完再导 —— 这种写法在 TP5.1 里必然卡死或超时,必须切到游标流式输出。

为什么 TP5.1 的 cursor() 是唯一靠谱路径

TP5.1 不支持原生 PDOStatement 流式 fetch,但提供了 cursor() 方法,底层调用的是 PDO 的 fetch(PDO::FETCH_ASSOC),每行只占几 KB 内存,10 万行也稳定在 5–8 MB。它不走 ORM 实例化,绕过模型层和自动类型转换,避免 blob 字段反序列化吃光内存。

  • cursor() 不支持 limit() 和 page(),分页得靠 SQL 条件:比如 where('id > ?', $lastId) + order by id
  • 必须显式指定字段:field('id,name,email,created_at'),否则 * 可能触发额外元数据查询,破坏流稳定性
  • 含 text 或 json 字段时,加 withoutField('content') 过滤掉,防止大字段被自动转字符串塞进内存

导出 CSV 必须写的三行头 + 两行清理

缺任何一行,Excel 打开中文就是乱码、文件损坏或下载失败。

图片转Excel
图片转Excel

从图片中提取表格数据并生成Excel文件。当用户提供截图、照片或扫描件中的表格数据,要求转成Excel/xlsx时触发。支持多张图片批量提取,自动识别列结构,数值类型自动识别(Excel可直接计算)。触发词:图片转Excel、截图转表格、图片提取数据、图片转xlsx、image to xlsx、screenshot to spreadsheet。

下载
  • 开头必须输出 BOM:echo "\xEF\xBB\xBF";,否则 Windows Excel 默认用 GBK 解码 UTF-8 中文
  • 响应头要全且顺序不能错:header('Content-Type: text/csv; charset=utf-8');、header('Content-Disposition: attachment; filename="export.csv"');、header('Cache-Control: no-cache');
  • 输出前必须清缓冲:ob_end_clean();,否则框架输出的空白、debug 信息会混入 CSV 开头,导致 Excel 无法识别
  • 写完后必须 fclose($output),否则部分 Nginx 配置下响应体不完整

fputcsv() 比框架封装更稳,但要注意字段顺序和空值

TP5 自带的 exportCsv() 封装会自动加引号、转义换行符,但字段顺序不可控、空值处理不一致;而原生 fputcsv() 把控制权交还给你。

  • 表头和数据行字段顺序必须严格一致,否则列对不上 —— 建议把字段名数组存成常量复用
  • null 和空字符串 '' 都会被 fputcsv() 写成空单元格,业务上需提前转成 'NULL' 或 'N/A'
  • 字段含逗号、换行符、双引号时,fputcsv() 自动加引号并转义,不用手动处理
  • 别用 str_putcsv() 拼字符串 —— 它不处理引号转义,CSV 格式极易崩

别碰 Excel,除非真需要公式或样式

TP5.1 里强行导 .xlsx 就是给自己设障:PhpSpreadsheet 写入 1 万行 ≈ 占 200MB 内存,且 fromArray() 分块写入仍需缓存整张 sheet 对象。如果只是“看起来像 Excel”,CSV + 后缀改 .xlsx 是最省事的伪装方案。

  • 真要 Excel,必须禁用计算引擎:$spreadsheet->setCalculationEngine(new \PhpOffice\PhpSpreadsheet\Calculation\Calculation());,否则含公式的模板一打开就卡死
  • 禁止逐单元格赋值:$sheet->setCellValue('A'.$row, $val),改用 fromArray($chunk, null, 'A2') 批量写入
  • 每 500 行调一次 ob_flush(),最后才 $writer->save('php://output'),否则缓冲区撑爆

真正难的不是写代码,是判断该不该导 Excel —— 大多数所谓“需要 Excel”的需求,其实只要 CSV 能打开、能排序、能筛选就够了。一旦选错格式路径,后面全是救火。

相关专题

更多
excel对比两列数据异同
excel对比两列数据异同

Excel作为数据的小型载体,在日常工作中经常会遇到需要核对两列数据的情况,本专题为大家提供excel对比两列数据异同相关的文章,大家可以免费体验。

2023.07.25

5301

7

excel重复项筛选标色
excel重复项筛选标色

excel的重复项筛选标色功能使我们能够快速找到和处理数据中的重复值。本专题为大家提供excel重复项筛选标色的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.31

3296

5

excel复制表格怎么复制出来和原来一样大
excel复制表格怎么复制出来和原来一样大

本专题为大家带来excel复制表格怎么复制出来和原来一样大相关文章,帮助大家解决问题。

2023.08.02

3080

3

excel表格斜线一分为二
excel表格斜线一分为二

在Excel表格中,我们可以使用斜线将单元格一分为二。本专题为大家带来excel表格斜线一分为二怎么弄的相关文章,希望可以帮到大家。

2023.08.02

1444

3

excel斜线表头一分为二
excel斜线表头一分为二

excel斜线表头一分为二的方法有使用合并单元格功能方法、使用文本框功能方法、使用自定义格式方法。本专题为大家提供excel斜线表头一分为二相关的各种文章、以及下载和课程。

2023.08.02

697

5

绝对引用的输入方法
绝对引用的输入方法

绝对引用允许在公式中引用一个固定的单元格,而不会随着公式的复制和粘贴而改变引用的单元格。本专题为大家提供绝对引用相关内容的文章,大家可以免费体验。

2023.08.09

5148

7

java导出excel
java导出excel

在Java中,我们可以使用Apache POI库来导出Excel文件。本专题提供java导出excel的相关文章,大家可以免费体验。

2023.08.18

6943

6

excel输入值非法
excel输入值非法

在Excel中,当输入的数值非法时,有以下多种处理方法。本专题为大家提供excel输入值非法的相关文章,大家可以免费体验。

2023.08.18

1721

3

excel生成二维码
excel生成二维码

虽然Excel本身并不直接支持生成二维码,但我们可以借助一些插件或宏来实现在Excel中生成二维码的功能。本专题为大家提供excel生成二维码的相关文章。

2023.08.18

2958

4

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Excel 教程
Excel 教程

共162课时 | 44.4万人学习

成为PHP架构师-自制PHP框架
成为PHP架构师-自制PHP框架

共28课时 | 3.6万人学习