导出CSV中文乱码需加UTF-8 BOM头(\xEF\xBB\xBF),确保数据UTF-8编码;大数据量须流式查询+边查边写;导出Excel推荐phpspreadsheet(功能全)或box/spout(轻量高效);超时问题应异步处理。

导出 CSV 文件时中文乱码怎么解决
PHP 生成 CSV 最常见的问题是 Excel 打开后中文显示为方块或乱码,本质是编码不匹配:Excel 默认用 ANSI(即 GBK/GB2312)解析 UTF-8 编码的 CSV。解决方法不是改 PHP 的 mb_internal_encoding(),而是给 CSV 内容加 BOM 头。
- 在
fputcsv()输出前,先用fwrite($fp, "\xEF\xBB\xBF")写入 UTF-8 BOM - 确保所有字段数据是 UTF-8 编码(如从 MySQL 查询后调用
mb_convert_encoding($row, 'UTF-8', 'GBK')做兜底转换) - 不要用
header('Content-Type: text/csv'),应设为text/csv; charset=utf-8,但注意 Excel 实际不读这个 header,BOM 才是关键
用 fputcsv() 导出大量数据内存爆掉怎么办
一次性把几万行查出来再循环写入,容易触发 Allowed memory size exhausted。必须流式处理,边查边写,不缓存整张表。
- 用 PDO 或 MySQLi 的无缓冲查询:PDO 设置
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => false;MySQLi 用mysqli_use_result() - 每写 500 行调用一次
ob_flush()和flush()(需确认服务器未启用 gzip 压缩,否则无效) - 避免在循环里拼接字符串,直接
fputcsv($fp, $row),不经过implode()或str_putcsv()
导出 Excel(.xlsx)该选哪个库
原生 PHP 不支持 .xlsx 格式,必须依赖第三方库。实际项目中只推荐两个:
Psky企业网站是基于PHP+MYSQL开发的一款企业官网宣传网站,支持PC、wap浏览。 主要功能包括导航管理、轮播新闻、单位动态、通知通报、单位简介、后台管理等。运行环境下载安装PHPStudy(小皮)即可。系统采用PHP语言(版本:7.3.4nts)和MYSQL(版本:5.7.26)数据库进行开发,安装PHPStudy(小皮)集成环境进行测试通过。安装步骤:1、导入SQL文件到PHPmyad
-
phpspreadsheet:功能全、文档好、持续维护,但体积大、生成 10 万行以上明显变慢;适合需要公式、样式、多 sheet 的场景 -
box/spout:轻量(仅几百 KB)、内存占用低、支持流式写入,但不支持单元格样式和公式;适合纯数据导出、大数据量 - 别用已废弃的
PHPExcel,也别手写 XML 模拟 xlsx——ZIP 结构+XML 校验极难稳定
用户点击导出按钮后页面卡住或超时怎么办
导出耗时操作不能阻塞 Web 请求生命周期,尤其当数据库查询慢或网络 I/O 高时。PHP 默认 max_execution_time=30,导出中途报 500 是常态。
立即学习“PHP免费学习笔记(深入)”;
- 前端加 loading 提示,并禁用按钮防止重复提交
-
后端用
set_time_limit(0)解除脚本超时,但要搭配ignore_user_abort(true)防止用户关页中断 - 更稳妥的做法是转为异步:用户点击后立即返回任务 ID,后台用 CLI 模式执行导出(
php /path/to/export.php --task=123),前端轮询状态并提供下载链接










