$html = ob_get_clean();
if (ob_get_level() > 0) { ob_end_clean(); }
// 每个 ob_start 都要有对应的 get_clean 或 end_clean

页面能打开,查看源码时 body 后面跟着三段空白和一段看似随机的字符,导出 CSV 时文件头还会多出几个字节,Excel 直接报格式错误。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。

追下去是这么回事:插件在钩子里开了输出缓冲却没在结束时输出或清掉,缓冲区被 PHP 在请求末尾自动吐出。二进制下载和 JSON 接口最先受影响,多一个字节就解析失败。

「插件输出缓冲」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。权限不要一口气开到最大,先加到够用再往上试,范围小才好收。

把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。

处理上按这个顺序:找到开启缓冲的位置 确认后面一定有配对的输出或清理调用;用 try 包住处理逻辑 异常分支里也要把缓冲关掉;缓冲只包住需要改写的片段 不要罩住整页。

确认没问题再收工,页面源码末尾不再有多余空白,导出的 CSV 用 Excel 打开没有格式警告。

作者 9823189