应使用 error_log() 替代 var_dump() 调试接口返回前状态,因其不依赖输出缓冲、不受 header 影响,可写入指定日志文件并支持时间戳与上下文;调试后需及时移除,生产环境须关闭 display_errors 但开启 log_errors,并通过 phpinfo() 确认配置生效。

用 error_log() 替代 var_dump() 查接口返回前的状态
接口没返回、返回空白或格式错乱时,var_dump() 和 echo 很容易被框架拦截、被 JSON header 冲掉,甚至触发“headers already sent”错误。直接写日志更稳,且能跨请求追踪。
-
error_log()默认写入 PHP 错误日志(如/var/log/php_errors.log或logs/php_error.log),不依赖输出缓冲,也不受Content-Type影响 - 加时间戳和上下文标识,比如:
error_log("[API user_get] input id: " . print_r($id, true), 3, "/tmp/api_debug.log"); - 调试完立刻删或注释掉,避免日志爆炸;生产环境务必关闭
error_log调试语句
开启 display_errors = Off 但保留 log_errors = On
本地开 display_errors = On 看报错很爽,但上线后暴露错误信息是安全风险。真正有用的配置组合是关显示、开记录,并确保日志路径可写。
- 检查当前配置:
phpinfo()搜索error_log和log_errors,确认值为On且路径存在、有写权限 - 在接口入口顶部临时加:
ini_set('log_errors', '1'); ini_set('error_log', '/tmp/myapi.log');,避免改全局配置 - 注意:Apache + mod_php 下,
error_log路径可能被 vhost 配置覆盖,优先看phpinfo()输出的实际路径
用 curl -v 看完整 HTTP 交互,不止看 body
前端说“接口没数据”,后端说“我 return 了”,问题常出在状态码、header 或重定向上。curl -v 能看到真实响应头、HTTP 版本、SSL 握手、跳转链路。
- 基础命令:
curl -v http://localhost/api/user?id=123 - 关键看三块:
> GET行(确认发的是什么)、(状态码是否异常)、<code>(类型是否匹配) - 如果返回 302,说明可能被中间件重定向到登录页;如果
Content-Length: 0但没 body,大概率是脚本 fatal error 后提前退出
捕获 Fatal error 导致的空响应
PHP 接口里一旦出现未定义函数、类找不到、语法错误,会直接 500 并返回空内容——浏览器只看到空白,error_log 里却有记录,但很多人没去看。
立即学习“PHP免费学习笔记(深入)”;
- 在入口文件最顶部加:
register_shutdown_function(function() { $e = error_get_last(); if ($e && in_array($e['type'], [E_ERROR, E_PARSE, E_CORE_ERROR])) error_log("FATAL: " . $e['message'] . " in " . $e['file'] . ":" . $e['line']); }); - 常见诱因:
require_once 'UserModel.php'路径错、命名空间漏写use、PHP 版本不兼容(如用了 8.0 的match在 7.4 运行) - 用
php -l your_api_file.php提前语法检查,比等 curl 返回空白再排查快得多
error_log 当探针、用 curl -v 看全链路、对 Fatal error 做兜底捕获,这三步走完,80% 的黑盒问题能立刻见光。别依赖浏览器 Network 面板——它只展示最终结果,不告诉你 PHP 进程是不是根本没活过 require 那一行。



















