线上服务需实时监控客户端连接数和worker进程健康状态,通过php start.php status命令读取共享内存统计值,重点关注connections字段;若connections长期接近或超过worker::$maxconnections,说明存在连接泄漏,需结合connections命令、state字段、total_request及netstat等手段排查。

线上服务需要实时掌握当前有多少客户端连着服务器,同时确认每个Worker进程是否健康运行,避免连接堆积或进程假死导致用户无法接入。
用status命令查看整体连接数和进程状态
在Workerman项目根目录下执行:php start.php status。
这条命令直接读取共享内存里的统计值,不 reload、不中断连接,是线上唯一可信的状态入口。
输出表格中重点关注 connections 字段——它代表该 Worker 当前处理的活跃 TCP 连接数(含客户端连接和内部 Gateway/Worker 通信连接);若使用 GatewayWorker 架构,真实客户端连接数 = connections 值减去 Worker 进程总数。
必须确保服务是以 -d 守护进程模式启动的,否则会提示 “no pid file” 或 socket 连接失败。
精准定位客户端连接泄漏问题
当 connections 长期接近或超过 Worker::$maxConnections 设定值(例如设了 1000,却持续维持在 950+),说明连接未正常释放。
常见原因包括:客户端心跳缺失未触发 onClose 回调、onClose 里有同步阻塞操作(如 file_get_contents、未加超时的 PDO 查询)、或业务逻辑中抛出未捕获异常导致 Workerman 静默吞掉后不再接受新连接。
这时需配合 php start.php connections 命令进一步排查,但注意该命令仅对 TCP/UDP 类型 Worker 生效,HTTP/WebSocket 默认不启用连接级统计,需在 Worker 初始化时手动添加:$worker->connection_class = \Workerman\Connection\TcpConnection::class;。
快速验证连接是否真实活跃
方法一:观察 status 输出中 state 字段。
若某 Worker 的 state 持续显示 busy 超过 30 秒,说明它正被同步操作阻塞,无法响应新连接或处理已有连接。
方法二:检查 total_request 是否停滞不动。
如果 connections 不为 0 但 total_request 长时间无增长,大概率是业务回调卡死或异常退出。
方法三:用系统命令辅助判断:netstat -anp | grep workerman | grep ESTABLISHED | wc -l 可粗略统计当前 ESTABLISHED 状态的连接数,与 status 中 connections 值交叉比对——若前者远小于后者,说明存在大量 close_wait 或 time_wait 状态连接,客户端未正常断连或 onClose 处理耗时过长。











