能执行 php start.php status 并看到带表头的表格输出,就说明 Workerman 4 的 Worker 进程已成功运行且状态可读;关键不是“有没有进程”,而是能否通过 Unix socket 真实读取到共享内存里的实时统计。

能执行 php start.php status 并看到带表头的表格输出,就说明 Workerman 4 的 Worker 进程已成功运行且状态可读;关键不是“有没有进程”,而是能否通过 Unix socket 真实读取到共享内存里的实时统计。
status 命令有效运行的三个前提
很多“查不到状态”的情况,其实卡在这三点上:
- 必须用
php start.php start -d启动(-d 是守护进程模式,缺它 status 就无法创建管理 socket) - 确认
start.php中未修改Worker::$pidFile路径;若改过,status 会去错误位置找 pid 文件 - /tmp/workerman.*.status 文件不能残留 —— stop 后再 start -d,旧 socket 若没清理干净,新进程会绑定失败
重点关注的四个核心字段
别被满屏数据干扰,盯住这四项就能判断 Worker 是否真正在处理业务:
-
connections:当前活跃连接数。若长期接近
Worker::$maxConnection(比如设了 1000,却常驻 980+),说明连接未正常释放,大概率是心跳缺失或onClose里有同步阻塞 -
total_request:该 Worker 累计处理请求数。如果停滞不动,而其他 Worker 正常增长,极可能是
onMessage或onWorkerStart抛了未捕获异常,导致后续请求被静默丢弃 -
mem_usage(单位 MB):缓慢持续上升(如 2小时从 25MB → 70MB)指向内存泄漏;突然跳变(15MB → 120MB)往往因大对象未
unset或全局数组无限追加 -
state:值为
busy且持续超过 30 秒,说明该进程正被同步操作卡住(例如 file_get_contents、无超时的 PDO 查询、curl 同步调用)
connections 命令:不是 status 的替代,而是深度排障工具
php start.php connections 只对 TCP/UDP 类型 Worker 生效(HTTP/WebSocket 默认不启用连接级统计),它输出每条连接的原始元数据,用于排查具体连接问题:
- 大量连接
send_queue_size > 0且last_send_time长期不更新 → 客户端已断开,但服务端因心跳超时设置过大或未开启 ping 机制尚未感知 - 出现一堆
close_wait状态 → 检查onClose回调中是否做了同步 IO(如发 HTTP 请求、写本地日志文件),这些会拖慢连接释放流程 - 高峰期慎用:输出可能达上万行,主进程会短暂卡顿;建议先低峰执行,配合
head -50或grep EST过滤
常见报错与速查思路
status 报错不是命令错了,而是通信链路中断:
-
No pid file → 服务根本没启动,或启动时漏了
-d,或$pidFile路径不可写 -
Can not connect to master process → socket 文件权限不对(如 root 启动、普通用户执行 status),检查
/tmp/workerman.*.status属主和是否为 644 权限 - 表格有数据但
connections=0且total_request不动 → 业务代码在onMessage开头就抛异常,Workerman 默认吞掉,连接不会断,但不再派发新请求

















