hyperf 生产环境默认隐藏错误详情,启用完整调试需设 app_debug=true(字符串)并配置 logger 级别为 debug,http 异常处理器会在调试开启时自动返回含 trace 的响应,切勿在生产环境启用。

Hyperf 默认在生产环境会隐藏错误详情,防止敏感信息泄露;要启用完整错误堆栈和调试信息,关键不是改 PHP 设置,而是正确配置 Hyperf 自身的调试开关与日志行为。
APP_DEBUG 必须设为 true 且生效
Hyperf 的错误显示逻辑由 APP_DEBUG 环境变量驱动,不是 display_errors 或 error_reporting。
确保 .env 文件中明确写入:
APP_DEBUG=true
该值必须为字符串 "true"(小写),不能是 1、on 或布尔 true —— env() 函数只识别字符串 'true' 并转为布尔 true。
配合日志级别开放 debug 输出
仅开启 APP_DEBUG 不会自动把 debug 日志刷到终端或文件,还需调高 logger 级别:
在 config/autoload/logger.php 中,将 default handler 的 level 设为 Monolog\Logger::DEBUG:
'default' => [
'handler' => [
'class' => StreamHandler::class,
'constructor' => [
'stream' => BASE_PATH . '/runtime/logs/hyperf.log',
'level' => Monolog\Logger::DEBUG, // ← 关键改动
],
],
],
这样 Log::debug()、异常上下文、SQL 绑定参数等才会写入日志。
HTTP 响应中显示错误详情(仅限开发)
Hyperf 的 HttpExceptionHandler 默认不向响应体输出堆栈,需确认:
-
config/autoload/exceptions.php中handler键是否指向Hyperf\ExceptionHandler\Handler\HttpExceptionHandler(默认即此) - 该处理器在
APP_DEBUG=true时会自动返回带 trace 的 JSON 或 HTML 响应,无需额外代码
⚠️ 注意:切勿在生产环境启用 APP_DEBUG=true,它会暴露路径、类名、数据库结构甚至 .env 变量片段。
验证是否生效的简单方法
- 修改任意一个 Controller,故意写一行
dd($undefinedVariable); - 发起 HTTP 请求,若看到带红色堆栈的页面或含
trace字段的 JSON 响应,说明已生效 - 同时检查
runtime/logs/hyperf.log是否有DEBUG级别记录,包括变量 dump 和 SQL 参数











