必须紧盯connections、total_request、mem_usage、state四项:connections长期高位提示连接未释放;total_request停滞表明进程卡死;mem_usage缓升为内存泄漏,突增或因大对象未释放;state持续busy说明存在同步阻塞。

直接执行 php start.php status 就能拿到真实、低干扰的运行快照——它不 reload、不中断连接,只读共享内存里的统计值,是线上唯一可信的状态入口。
status 命令输出里哪些字段必须盯紧?
别被满屏字段带偏,重点关注这四个:
-
connections:当前活跃连接数。长期接近Worker::$maxConnection(比如设了 1000,却常驻 950+),说明连接释放卡住,或客户端心跳缺失没触发onClose -
total_request:该 worker 累计处理请求数。若停滞不动,而其他 worker 正常增长 → 很可能卡在业务回调里(比如未 catch 的异常、死循环、await 未 resolve) -
mem_usage:单位 MB。缓慢爬升(如 20MB → 60MB 持续两小时)大概率是内存泄漏;突然跳变(15MB → 80MB)往往对应大对象未unset或全局缓存无限写入 -
state:值为busy且持续 >30 秒,说明该进程正被同步阻塞(如 file_get_contents、PDO 查询没加超时、curl 同步调用)
为什么 status 显示 “no pid file” 或报 socket 连接失败?
这不是命令错了,而是通信链路断了。常见原因:
- 服务没用
-d守护进程模式启动 →php start.php start -d补上再试 -
/tmp/workerman.*.status文件残留:stop 后又 start -d,旧 socket 没清理干净 → 手动rm /tmp/workerman.*.status* - 权限不一致:root 启动的服务,非 root 用户执行 status → 统一用业务用户启动,或改
Worker::$pidFile路径权限 - Workerman 版本太老(status → 改用
php start.php --status
connections 命令比 status 更细,但容易误用
php start.php connections 不是 status 的增强版,而是另一类诊断工具,只在 TCP/UDP Worker 中生效(HTTP/WebSocket 默认不启用连接级统计)。
- 要让它输出连接时间、缓冲区等细节,得在 Worker 初始化时加:
$worker->connection_class = \Workerman\Connection\TcpConnection::class; - 输出里大量
send_queue_size > 0且last_send_time长期不更新 → 客户端已断连,但服务端因心跳缺失或Worker::$connectionTimeout过大还没检测到 - 高峰期慎用:输出可能超万行,主进程会短暂卡住 → 先在低峰跑一次,再用
head -50或grep过滤 - 看到一堆
close_wait状态?检查onClose回调里有没有同步 IO(比如发 HTTP 请求、写日志文件),这些操作会拖慢连接释放
真正难的不是看懂数字,而是把 connections 和 total_request 的异常变化,跟代码里某次 yield 卡住、某处 file_put_contents 没加锁、某个全局数组没清空这些细节对上号——状态命令只报“哪里疼”,不告诉你“为什么疼”。

















