status命令是线上查状态的唯一可靠入口,它不重启、不reload、只读共享内存统计,需守护进程模式启动,重点关注connections、total_request、mem_usage三项指标。

status 命令是线上查状态的唯一可靠入口
线上环境不能停服务,php start.php status 就是你能用的最直接、最安全的状态快照工具。它不重启、不 reload、不干扰任何连接,只读取当前 Worker 进程共享的统计内存 —— 所以哪怕服务卡在某个死循环里,只要主进程还在跑,这个命令就还能返回结果。
- 必须确保服务是以
-d(守护进程)模式启动的,否则status会报 “no pid file” 或连不上管理 socket - 输出中重点关注
connections(当前活跃连接)、total_request(该 worker 累计处理请求数)、mem_usage(MB 级内存占用),三者长期不变化往往意味着阻塞或 hang 住 - 如果某 worker 的
connections持续为 0 但total_request不增长,大概率是它的业务回调里抛了未捕获异常,被 Workerman 静默吞掉后不再接受新连接
connections 命令能暴露连接生命周期问题
php start.php connections 是诊断连接泄漏、协议粘包、客户端异常断连的利器,但它要求 Workerman ≥ 3.5.0,且只在 TCP/UDP 类型 Worker 中生效(HTTP/WebSocket 默认不启用连接级统计,需手动开启)。
- 默认不显示连接建立时间、最后收发时间、缓冲区大小,要看到这些,得在 Worker 初始化时加一行:
$worker->connection_class = \Workerman\Connection\TcpConnection::class; - 输出里若出现大量
close_wait或time_wait状态连接,说明客户端没正常发 FIN,或者你的 onClose 回调里有耗时操作(比如同步写日志、发 HTTP 请求),导致连接无法及时释放 - 注意:该命令输出可能超长,建议管道过滤,例如:
php start.php connections | head -50
不用 echo/var_dump,也能在线看业务日志
线上禁用 echo 和 var_dump,但不代表没法调试逻辑。Workerman 提供了 Worker::$stdoutFile 和 Worker::$logFile 两个开关,把本该打屏的内容导出到文件,配合 tail -f 实时追踪完全可行。
- 在
start.php加载 Worker 之前设置:Worker::$stdoutFile = '/tmp/workerman_stdout.log';,所有echo/print都会落盘,无需改业务代码 - 更推荐用结构化日志,比如 Monolog + Request ID:给每个连接分配唯一
$connection->id,在日志里带上它,就能串起一次请求的全部 IO 路径 - 切记检查文件权限和磁盘空间 —— 曾有案例因
/tmp满了导致日志写失败,而错误又没记录,最终表现为“什么都没输出”
别信“实时监控页面”,先看 status 文件本身
Workerman 在运行时会自动生成两个关键状态文件:workerman.*.status(主进程指标)和 workerman.*.status.connection(连接明细),它们是 status 和 connections 命令的数据源,也是你绕过命令行、用脚本/运维系统集成监控的底层依据。
- 路径通常在 Workerman 启动目录下,文件名带 PID,例如:
workerman.12345.status,内容是纯文本 JSON,可直接cat或jq解析 - 这些文件每秒自动刷新,但不是原子写入 —— 如果恰好在写入中途读取,可能拿到半截 JSON,解析失败属正常现象,重试即可
- 第三方监控如 Workerman-Statistics 插件,底层也是轮询读这两个文件,没必要为了简单状态查看额外引入复杂依赖
真正难的从来不是“怎么看到状态”,而是看到异常值之后,能不能快速判断是代码 bug、连接泄漏、还是系统资源瓶颈 —— 这需要你心里有一张表:哪些指标突变对应哪类问题,而不是等报警才打开终端。










