Hyperf 命令行需配置全局异常处理器并适配 CLI 环境,通过 config/autoload/exceptions.php 注册、ExceptionHandler 中用 Console::error() 输出堆栈、添加 ob_flush()/flush() 强制刷新,并用 -vvv 参数开启详细日志验证。

Hyperf 默认不会在命令行中自动打印未捕获的异常堆栈,导致调试脚本时错误被静默吞掉。要让执行出错时清晰显示完整报错信息,关键在于配置异常处理器并确保错误输出到终端。
启用全局异常处理器
Hyperf 的命令行命令默认使用 StdoutLogger,但未捕获异常仍可能被忽略。需确认项目已注册全局异常处理器:
- 检查 config/autoload/exceptions.php 是否存在且返回了正确的处理器配置
- 确保 ExceptionHandler 类中
render()方法对 CLI 环境做了适配:调用$exception->getTraceAsString()或使用Console::error()输出 - 若使用自定义命令,可在
handle()方法中手动 try-catch 并throw $e,交由全局处理器处理
强制刷新错误输出缓冲
某些情况下(如协程环境或重定向输出),错误信息可能被缓存而未即时显示:
- 在异常处理器末尾添加
ob_flush(); flush();确保输出立即刷出 - 启动命令时加
-vvv参数(如php bin/hyperf.php demo:run -vvv)可开启超详细日志,包含异常上下文 - 避免在命令中调用
exit()或die(),它们会跳过异常处理流程
验证是否生效的小技巧
快速测试配置是否起作用:
- 写一个故意出错的命令,例如在
handle()中写echo $undefinedVar; - 运行命令,观察是否打印出
Notice: Undefined variable及完整堆栈 - 若只看到空白或“Command finished”,说明异常未被捕获,需回查
exceptions.php和ExceptionHandler是否启用



















