使用MySQLi时PHP输出莫名出现换行符(0x0a)问题排查
问题:mysqli_query执行时输出额外换行符的异常排查
我在搭载PHP 7.2.24的RHEL 8服务器上运行如下简单PHP脚本:
<?php // Establish Connection include_once("db_connect.php"); // Perform any query $sql = "SELECT now()"; // The following (mysqli_query call) should do nothing, yet echoes two line feeds $result = mysqli_query($conn,$sql); echo "TEST"; ?>
当通过WGET将脚本输出直接保存到文件时,文件的十六进制内容为:0a0a 5445 5354,即TEST前存在两个未手动输出的换行符。该换行符仅在执行mysqli_query时才会插入,注释该行后输出则为预期的5445 5354。奇怪的是,在搭载同版本PHP的CentOS 8远程服务器上运行相同脚本却无此问题。请问这是什么原因?两台系统间是否存在相关配置差异?
排查方向及原因分析
检查
db_connect.php文件:
优先查看该文件内容,确认文件开头的<?php标签前是否有空白或换行,或者结尾的?>标签后是否存在多余换行。include_once引入文件时,这些空白内容会直接输出到响应中,而只有当执行mysqli_query触发数据库连接初始化时,才会间接暴露这个问题(比如连接逻辑延迟了输出的触发)。PHP mysqli扩展配置差异:
对比两台服务器php.ini中的mysqli相关配置:- 检查是否开启了
mysqli.debug参数,RHEL8上若开启调试模式,可能会在执行查询时输出额外调试信息(换行符属于这类信息的一部分)。 - 查看
mysqli.report_mode配置,不同的报告级别可能导致额外输出,CentOS8可能设置了更严格的静默模式,而RHEL8保留了默认的报告输出。
- 检查是否开启了
PHP编译/扩展版本细微差异:
虽然PHP主版本相同,但RHEL和CentOS的PHP包可能来自不同源(比如RHEL用官方AppStream,CentOS用第三方源),mysqli扩展的编译参数或补丁不同,导致执行查询时产生额外换行输出。
验证方法
- 临时替换RHEL8上的
db_connect.php为CentOS8上的同文件,测试是否还出现换行。 - 在RHEL8的
php.ini中临时关闭mysqli.debug(设置为mysqli.debug = ""),重启PHP-FPM或Apache后重试。 - 在脚本中添加
ob_start();在include_once之前,ob_end_clean();在mysqli_query之后,看是否能抑制多余输出,验证是否是缓冲外的直接输出导致。
内容的提问来源于stack exchange,提问作者user3120127
相关产品推荐
相关产品推荐

