由PHP-FPM生成的字节顺序标记(BOM)

由PHP-FPM生成的字节顺序标记(BOM),php,byte-order-mark,fpm,Php,Byte Order Mark,Fpm,我有一个PHP脚本,它提供一个jpeg图像来响应http查询 ob_start(); header('HTTP/1.1 200 OK'); header('Cache-Control: no-cache, must-revalidate'); // don't want any caching header('Content-Type: image/jpeg'); header("Content-Length: $len"); readfile($fn); ob_en

我有一个PHP脚本,它提供一个jpeg图像来响应http查询

ob_start();
header('HTTP/1.1 200 OK');
header('Cache-Control: no-cache, must-revalidate');     // don't want any caching
header('Content-Type: image/jpeg');
header("Content-Length: $len");
readfile($fn);
ob_end_flush();
此脚本在Apache mod-php7(Ubuntu 16.04)上运行良好,但在Apache和PHP-FPM(Ubuntu 20.04)上使用相同的脚本会导致jpeg流以BOM为前缀,浏览器会将BOM视为无效jpeg

我还尝试用wget保存查询响应,我可以将BOM作为响应正文的前3个字节,位于标题之后

如果我直接获取jpeg,绕过脚本,一切正常

我很满意BOM在ob_end_flush()的缓冲区中不存在(我临时向ob_start添加了一个过滤器以检查缓冲区)

因此,php fpm似乎出于某种原因正在添加BOM。php fpm错误日志中没有任何内容


是什么导致了这种情况?

BOM可能位于
Thx之前的
.php
脚本文件中。我和Hextump查过了。没有BOM。BOM可能在
.php
脚本文件本身中,在
Thx之前。我和Hextump查过了。没有物料清单。