PHP导出失败主因是版本不兼容导致函数行为变更,需依错误日志定位json_encode()、fputcsv()或TCPDF哪层异常;5.4+支持JSON_UNESCAPED_UNICODE,8.1+严格校验数组键类型,须检查数据类型并加兜底判断。

PHP版本不兼容直接导致数据导出失败,核心原因不是“导出逻辑错了”,而是底层函数行为、类型约束或扩展兼容性被新版本打破。必须先锁定是哪一层崩了——是 json_encode() 报错?fputcsv() 写出乱码?还是 TCPDF 初始化就抛异常?别猜,看错误日志+查 PHP 版本链。
导出 JSON 时中文变 uXXXX 或直接报错
PHP 5.4+ 支持 JSON_UNESCAPED_UNICODE,但低于该版本会直接忽略这个 flag;PHP 8.1+ 又对数组键类型更严格,若传入非字符串键(比如 null 或数字索引混用),json_encode() 会抛 TypeError 而不是静默失败。
- 检查错误日志是否含
TypeError: json_encode(): Argument #1 ($value) must be of type array|stdClass, null given—— 说明数据源没兜底,加is_array($data) ?: [] - 确认 PHP 版本:
php -v,若 preg_replace('/\u([0-9a-f]{4})/ie', "iconv('UCS-2BE', 'UTF-8', pack('H4', '\1'))", $json) 手动解码(仅应急) - PHP 8.0+ 下避免用
json_encode($arr, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)这种写法,确保所有 flag 是整数常量,别拼错位
fputcsv 导出 CSV 在 Excel 里全乱码或字段错位
根本问题不在函数本身,而在输出前的编码环境和缓冲区状态。PHP 7.4 默认禁用短标签,若导出脚本开头有 且没开 short_open_tag=On,就会提前输出空字符,破坏 CSV 结构;PHP 8.2+ 对 fopen('php://output') 的上下文校验更严,若 header 已发送再调用会直接 fatal。
- 导出脚本必须以
<?php开头,保存为 UTF-8 无 BOM 格式(BOM 头是隐形乱码元凶) - 必须在
fputcsv()前调用ob_clean();和ob_end_clean();,清掉所有可能的前置输出 - 写 BOM 头不能用
echo "";,得用fwrite($fp, "");($fp是fopen('php://output', 'w')返回的句柄) - 字段含换行符时,
fputcsv()自动加双引号,但若手动拼接字符串再写入,必错位——永远别绕过fputcsv()
TCPDF 初始化失败或中文显示方块
TCPDF 对 PHP 版本和扩展依赖极重:PHP 8.0+ 下 create_function() 彻底移除,老版本 TCPDF(≤6.2.x)会直接 fatal;PHP 8.2+ 的动态属性赋值(如 $pdf->foo = 'bar')触发弃用警告,而 TCPDF 6.x 大量使用该模式,导致 PDF 生成中断。
立即学习“PHP免费学习笔记(深入)”;
- 先运行
php -m | grep -E "(gd|mbstring|xml)",缺mbstring会导致字体加载失败,报Could not include font definition file - 确认 TCPDF 版本:
grep "define.*TCPDF_VERSION" tcpdf/tcpdf.php,若 ≤6.2.27,必须升级到 6.6.5+ 或改用setasign/fpdi+tcpdf组合 - 中文字体路径必须是绝对路径,
$pdf->addTTFFont(__DIR__.'/fonts/simhei.ttf'),相对路径在 CLI 模式下极易失效 - PHP 8.2+ 环境下,在 new TCPDF 前加
ini_set('error_reporting', E_ALL & ~E_DEPRECATED);临时屏蔽动态属性警告(治标),长期方案是升 TCPDF 或切到 Dompdf
最易被忽略的是:导出逻辑往往夹在框架中间件里,比如 ThinkPHP 的 after 钩子或 Laravel 的 terminate 方法,这些地方 PHP 版本升级后可能提前关闭了输出缓冲,导致 php://output 不可用——此时必须把导出动作提到响应生成阶段,而不是“事后补救”。



















