You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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扩展的编译参数或补丁不同,导致执行查询时产生额外换行输出。

验证方法

  1. 临时替换RHEL8上的db_connect.php为CentOS8上的同文件,测试是否还出现换行。
  2. 在RHEL8的php.ini中临时关闭mysqli.debug(设置为mysqli.debug = ""),重启PHP-FPM或Apache后重试。
  3. 在脚本中添加ob_start();在include_once之前,ob_end_clean();在mysqli_query之后,看是否能抑制多余输出,验证是否是缓冲外的直接输出导致。

内容的提问来源于stack exchange,提问作者user3120127

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 04:02:40