Hyperf 生产环境需同时开启 PHP 的 display_errors=On 和 error_reporting=E_ALL,并将 exceptions.php 中的异常处理器替换为 DevelopmentExceptionHandler,才能显示完整错误堆栈。

Hyperf 默认在生产环境会隐藏详细错误信息,比如 500 错误只返回空白页或通用提示,不利于排查问题。要解除这个限制,核心是控制 display_errors、error_reporting 和框架自身的异常处理器行为,而不是简单改一个配置项。
确保 PHP 层级错误显示开启
Hyperf 启动依赖 CLI 环境,所以必须让 PHP CLI 模式能输出错误。检查并修改对应 php.ini(注意:CLI 和 FPM 的配置文件可能不同):
- 运行
php --ini查看实际加载的配置路径 - 编辑
Loaded Configuration File对应的php.ini,确认以下两项:-
display_errors = On error_reporting = E_ALL
-
⚠️ 注意:仅设
display_errors = On不够,若error_reporting = 0,依然看不到任何报错。两者需同时生效。
关闭 Hyperf 的异常静默处理
Hyperf 在 config/autoload/exceptions.php 中默认启用了 ExceptionHandler,它会捕获所有未处理异常并返回友好响应。开发调试时可临时禁用或调整:
使用ydata-profiling(前身为pandas-profiling)生成全面的数据质量报告,包含相关性分析、缺失值模式和基数检测。导出交互式HTML仪表板和JSON摘要。
- 打开
config/autoload/exceptions.php - 找到
'handler' => [Hyperf\ExceptionHandler\Handler\ProductionExceptionHandler::class] - 改为开发用的处理器:
'handler' => [ Hyperf\ExceptionHandler\Handler\DevelopmentExceptionHandler::class, ],
该类会直接输出带堆栈的完整错误,包括文件、行号、变量 dump。
验证是否生效的小技巧
在任意控制器里加一行触发错误的代码,例如:
public function test()
{
throw new \Exception('手动触发测试');
}访问对应路由,应看到带完整 trace 的错误页面,而非“Server Error”或空白。
额外提醒:别被 Docker 或 Supervisor 拦截了输出
- 若用 Supervisor 管理进程,确保没重定向 stdout/stderr 到
/dev/null - 若在 Docker 中运行,启动命令不要加
--daemonize,否则错误全被 Swoole 吞掉 - 日志通道也要检查:
config/autoload/logger.php中default驱动的level建议设为'debug',确保错误写入runtime/logs/
基本上就这些。

















