hyperf 不支持 laravel 的 whoops 页面,需三步配置调试:设 app_env=local、启用 debug 级日志并确保 storage/logs 可写、自定义异常处理器返回含 trace 的 json 响应。

Hyperf 不支持 Laravel 那种 APP_DEBUG=true 直接弹出 Whoops 页面的原生错误提示机制。它默认走协程异常处理器链,错误信息会以 JSON 形式返回(如 {"message":"..."}),不会渲染 HTML 错误页。想在开发中快速看到结构化、带堆栈的错误详情,需分三步配置:
确认 .env 文件已正确加载且环境为 local
Hyperf 的调试行为依赖 APP_ENV 值,而非单独的 APP_DEBUG。必须确保:
- 项目根目录下存在
.env文件 - 文件中包含
APP_ENV=local(大小写敏感) - 没有系统级环境变量(如 shell 中
export APP_ENV=production)覆盖它 - 启动后执行
php bin/hyperf.php env可看到输出local
启用详细日志并确保日志路径可写
错误不会直接显示在终端或浏览器,而是写入 storage/logs/hyperf.log:
- 检查
storage/logs/目录权限是否允许 PHP 进程写入(Linux/macOS 下常见问题) - 确认
config/autoload/logger.php中'default' => 'stdlog'对应的 handler 配置未禁用 debug 级别 - 日志级别建议设为
'level' => 'debug',否则info及以上级别会过滤掉部分异常上下文
配置自定义异常处理器捕获并格式化错误
Hyperf 默认的 HttpExceptionHandler 仅返回 message 和 status,不带 trace。要看到完整堆栈:
- 在
config/autoload/exceptions.php中,将AppExceptionHandler放在HttpExceptionHandler之后 - 自定义处理器中显式调用
$throwable->getTraceAsString()或使用Throwable::getTrace() - 返回响应时手动设置状态码,并把 trace 加入 JSON body,例如:
return $response->withStatus(500)->withBody(new SwooleStream(json_encode([ 'message' => $throwable->getMessage(), 'file' => $throwable->getFile(), 'line' => $throwable->getLine(), 'trace' => $throwable->getTraceAsString(), ], JSON_UNESCAPED_UNICODE))); - 别忘了在处理器里调用
$this->stopPropagation(),防止被后续处理器覆盖
这样配置后,当代码抛出异常,接口会返回含完整堆栈的 JSON,配合 VS Code 的 REST Client 或 curl 查看,比盲猜快得多。











