hyperf 通过环境变量 app_debug=true 启用调试模式以显示详细错误信息,需确保 .env 文件正确加载且在 config/autoload/exceptions.php 加载前生效,同时日志级别设为 debug 并适配异常处理器。

Hyperf 默认在生产环境关闭详细错误信息输出,防止敏感信息泄露;若需启用框架级错误详情(如异常堆栈、参数、SQL语句等),关键不是改 @Value 或写死配置,而是通过 环境变量控制底层行为,并确保加载时机正确。
用 APP_DEBUG 控制错误输出开关
Hyperf 遵循 Laravel/PHP 通用约定:
设置 APP_DEBUG=true 即可开启调试模式,触发框架层的详细错误响应和日志记录。
该变量需在 .env 文件中声明,并在容器初始化后生效:
APP_DEBUG=true
⚠️ 注意:
-
APP_DEBUG=false时,HTTP 错误只返回通用提示(如500 Internal Server Error),不暴露堆栈; -
APP_DEBUG=true时,Web 请求会返回带完整异常堆栈的 HTML 页面,CLI 命令也会打印详细错误; - 此变量必须在
config/autoload/exceptions.php加载前已注入$_ENV,否则无效。
确保 .env 被正确加载且 APP_DEBUG 生效
常见失效原因及修复方式:
- 检查
.env是否位于项目根目录(BASE_PATH . '/.env')且权限可读 - 环境变量名不能含空格或未加引号(✅
APP_DEBUG=true,❌APP_DEBUG= true或APP_DEBUG="true ") - 不要用
export APP_DEBUG=true启动命令——CLI 进程不继承 shell 的export变量,.env才是唯一可靠来源 - 修改
.env后必须重启服务(kill -USR1或完全 stop + start),缓存不会自动刷新
验证是否生效:
在任意控制器中加入:
var_dump(env('APP_DEBUG')); // 应输出 true 或 false
若为 false 或 null,说明 .env 未加载或变量名拼错。
配合日志级别提升错误可见性
仅开 APP_DEBUG 不够,还需让错误真正写入日志:
- 确认
config/autoload/logger.php中'level' => 'debug'(非'info'或'warning') - 若使用自定义异常处理器(如
ValidationExceptionHandler),确保它在APP_DEBUG=true时返回结构化错误,而非静默吞掉
例如,在 exceptions.php 中可加判断:
if (env('APP_DEBUG', false)) {
return $response->withStatus(422)->withBody(new SwooleHttpStream(json_encode([
'message' => $throwable->getMessage(),
'errors' => $throwable->validator->errors()->toArray(),
])));
}
别踩这些坑
- ❌ 不要试图用
@Value("APP_DEBUG")—— Hyperf 没这个注解,会始终为null - ❌ 不要在
config/autoload/*.php里直接调用env('APP_DEBUG')并赋值给静态配置项 —— 加载太早,.env尚未解析 - ❌ 不要依赖
$_SERVER['APP_DEBUG']—— 协程下不可靠,应统一走env()函数 - ✅ 最稳妥做法:
.env设值 →APP_DEBUG控制全局行为 → 日志 level 匹配 → 异常处理器响应格式适配
不复杂但容易忽略











