PHP调用MariaDB的API本地正常但线上read.php无返回数据排查求助
问题根因
- 数据库连接未指定UTF-8字符集:当前PDO连接代码未设置字符集,当
tester表中存在非UTF-8编码内容(如乱码中文、特殊符号)时,json_encode()会因无法处理非UTF-8字符返回false,无任何输出。test表无此类异常字符所以可以正常输出。 - 输出缓冲区大小限制:
tester表384条记录生成的JSON体积大于test表的115条,超过PHP默认的输出缓冲区上限时会出现内容截断、无输出的情况。 - 无JSON编码错误校验:现有代码未捕获
json_encode()的错误,出错时无法感知问题。 - 部分文件存在格式问题:
read.php或call.php可能携带BOM头、文件开头有前置空格/换行,导致输出被提前触发、JSON结构被破坏。
解决方案
1. 修复数据库连接字符集
修改/config/Database.php中的PDO连接代码,明确指定charset=utf8mb4:
try { $this->conn = new PDO( 'mysql:host=' .$this->host . ';dbname=' .$this->db_name . ';charset=utf8mb4', $this->username, $this->password ); $this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); }catch(PDOException $e) { echo 'Connection Error: ' . $e->getMessage(); }
2. 排查文件格式问题
检查read.php、call.php的文件编码为无BOM的UTF-8格式,确认<?php标签前没有任何空格、换行、不可见字符,避免提前输出内容破坏JSON结构。
3. 添加JSON编码错误校验
修改read.php中输出JSON的代码,添加错误判断,异常时返回可定位的错误信息:
$json = json_encode($post_arr, JSON_UNESCAPED_UNICODE); if (json_last_error() !== JSON_ERROR_NONE) { echo json_encode([ 'code' => 500, 'message' => 'JSON编码失败:' . json_last_error_msg() ]); exit; } echo $json;
JSON_UNESCAPED_UNICODE参数可避免中文被转义,减少JSON体积。
4. 调整输出缓冲区配置
在read.php顶部添加代码解除输出、内存限制:
ini_set('memory_limit', '128M'); ob_clean();
Apache环境可同时在.htaccess文件添加配置:
php_value output_buffering 4096 php_value memory_limit 128M
5. 批量输出优化(可选)
如果后续数据量继续增长,可改为逐行输出JSON,避免一次性加载所有数据到内存:
if ($num > 0) { echo '{"data":['; $first = true; while($row = $result->fetch(PDO::FETCH_ASSOC)) { if (!$first) echo ','; $first = false; echo json_encode($row, JSON_UNESCAPED_UNICODE); } echo ']}'; }
内容的提问来源于stack exchange,提问作者DahkNesh232
相关产品推荐
相关产品推荐

