Hyperf 需配置 Swoole 和 PHP 两层错误透出:设 Swoole\Error::$log_level = SWOOLE_LOG_ERROR、$log_file = 'php://stderr',并在 server set 中同步配置;启用 swoole.display_errors = On,注册协程异常处理器输出 [COROUTINE ERROR]。

Hyperf 默认不会把 Swoole 底层的运行时错误(比如协程调度异常、连接重置、内存分配失败等)直接输出到终端,这些错误往往静默发生,只记录在 Swoole 自己的日志里。要让关键报错“看得见”,得从 PHP 层和 Swoole 层两头配置。
开启 Swoole 全局错误日志输出
在服务启动前(例如 bin/hyperf.php 的入口或 ServerProvider 中),添加以下代码:
- 强制启用 Swoole 内部错误日志:
Swoole\Error::$log_level = SWOOLE_LOG_ERROR; - 确保错误能打到标准错误流(即终端):
Swoole\Error::$log_file = 'php://stderr'; - 若使用
swoole_http_server或swoole_websocket_server实例,还需在$server->set()中显式设置:'log_file' => 'php://stderr', 'log_level' => SWOOLE_LOG_ERROR
暴露 PHP 层未捕获异常与致命错误
Hyperf 运行在协程中,普通 try/catch 无法捕获协程内抛出的异常。需补充两层兜底:
- 启用 PHP 错误透出:在
php.ini中设swoole.display_errors = On,并确认display_errors = On和error_reporting = E_ALL - 注册全局协程异常处理器:
Swoole\Coroutine::set(['hook_flags' => SWOOLE_HOOK_ALL]);后,调用Swoole\Coroutine::set(['exception_handler' => function($e) { error_log('[COROUTINE ERROR] ' . $e->__toString()); }]);
验证是否生效
改完后重启服务,手动触发一个底层错误来测试,例如:
- 用
curl访问一个不存在的路由,观察终端是否出现SWOOLE_LOG_ERROR级别的提示 - 在控制器里写一段非法协程调用(如
go(function () { throw new RuntimeException('test'); });),看终端是否打印出[COROUTINE ERROR] - 执行
php --ri swoole,确认输出中log_level和log_file配置已加载
只要终端能看到 ERROR 或 COROUTINE ERROR 开头的输出,说明底层错误已浮出水面,排查就不再靠猜。


















