在 Workerman 常驻内存应用运行过程中,确认进程是否还在正常对外提供服务,是每次发版或巡检都要做的事情。除了查看日志文件,命令行直接执行 php start.php status 是更快的选择。该命令会读取主进程维护的全局统计信息,并用文本表格的方式展示出来。它的优势在于无需进入数据库或查看监控面板,只要服务器能登录,就能立刻判断服务是否处于就绪状态。

默认情况下,status 命令展示的是全局概览,包括 Workerman 版本、PHP 版本、启动时间、运行时长、负载情况、进程数量等。不同版本在字段命名上可能略有差异,但核心内容基本一致。如果只需要判断服务是否还在运行,看这一屏就已经足够。例如进程数不为零、退出状态正常、监听地址存在,就说明主进程和 Worker 进程都已经就绪。
status 命令基础用法与全局状态解读
进入 Workerman 项目目录后,执行 php start.php status 即可查看状态。这里的 start.php 是 Workerman 启动脚本,如果你的入口文件名不同,例如 server.php 或 worker.php,需要替换成实际文件名。命令执行后,Workerman 会通过主进程收集当前所有 Worker 进程的信息,并在终端输出。该命令不会影响正在运行的业务逻辑,因为它只是读取统计信息,不会触发重启或中断连接。
全局状态中通常包含 Workerman version、PHP version、start time、run time、load average 等字段。start time 表示主进程启动的时刻,run time 表示已经运行了多长时间。对于生产环境来说,运行时间很长说明进程没有频繁崩溃或重启;如果发现运行时间短但部署时间较早,就要怀疑发生过异常退出或手动重启。负载字段反映系统整体压力,数值长期偏高时,即使 Worker 看似正常,也可能影响响应速度。
此外,全局状态还会显示 worker_name、exit_status、exit_count 等信息。exit_status 表示 Worker 最后一次退出的状态码,正常退出通常为 0;如果出现非 0 值,说明该 Worker 是因为某种错误而退出。这时需要结合日志进一步排查。全局概览是快速判断服务是否在运行的第一步,但它不涉及每个进程的细节,所以还需要使用带参数的 status 命令。
status 命令参数详解与输出字段
要查看更详细的运行数据,可以在 status 后追加 -d 参数,即执行 php start.php status -d。这个参数会让 Workerman 输出每个进程的独立信息,包括进程 ID、内存占用、监听地址、连接数、请求总数和处理失败数量等。相比默认的全局状态,-d 模式更适合定位具体是哪个 Worker 进程出现异常,例如某个进程内存持续升高、连接数堆积或者发送失败次数异常。
在详细输出中,pid 用于标识进程 ID,便于使用 kill -0 或 ps -p 进一步确认进程是否存在。memory 表示当前进程占用的内存大小,如果某几个 Worker 的内存明显高于其他进程,很可能是业务逻辑处理长连接或缓存的差异导致。生产环境中可以定期采样这个字段,观察是否存在内存泄漏。listening 展示该 Worker 监听的协议和端口,例如 tcp://0.0.0.0:2346,如果这个值缺失或不是预期地址,则说明该 Worker 可能没有完成端口绑定。
connections 表示当前进程维持的活动连接数,total_request 是累计处理的请求数量。当连接数长时间保持高位却不再增长,同时 CPU 使用率较低,可以怀疑连接泄漏或客户端没有正常关闭连接。当 total_request 持续上升,说明业务在被正常调用;如果某个 Worker 的 total_request 明显低于其他 Worker,可能是负载不均衡,需要检查是否因为客户端连接固定到特定进程导致。
下面代码块是一个典型输出示例,字段会根据版本略有差异。
$ php start.php status -d Workerman[start.php] status ---------------------------------------GLOBAL STATUS------------------------------------ Workerman version:4.0.19 PHP version:7.4.3 run time:30 days 08:12:45 load average:0.01,0.05,0.10 1 workers 1 processes worker_name exit_status exit_count ChatBusiness 0 0 ---------------------------------------PROCESS STATUS----------------------------------- pid memory listening worker_name connections total_request send_fail timers 1234 12M tcp://0.0.0.0:2346 ChatBusiness 0 123456 0 0
需要注意的是,上例中的字段只是为了方便说明,实际值会根据你的服务器情况显示。使用 -d 参数时,如果进程数量非常多,输出会很长,可以配合 grep 等命令过滤,例如 php start.php status -d | grep worker_name。
结合 status 输出排查常见运行问题
在日常运维中,status 命令可以帮你快速缩小问题范围。比如服务明明启动过,但客户端连接超时,可以先执行 php start.php status -d,看 listening 字段是否包含预期端口。如果端口没有出现,可能是 Worker 进程启动失败或监听了错误地址。如果端口存在但 connections 一直为 0,则要检查防火墙、安全组或者客户端配置是否正确。
第二种常见场景是进程假死:进程还在但不再处理请求。这时可以连续多次执行 php start.php status -d,观察 total_request 是否增长。如果请求数长时间不变,同时日志也无新增内容,可能该 Worker 被阻塞在某个同步阻塞调用中,例如 curl、数据库查询或文件锁。定位到具体 pid 后,可以通过 strace -p pid 或 pmap -x pid 进一步分析,但那是另一个层面的排查方式。
第三种是内存异常升高。如果 memory 字段在某个进程持续增长而不回落,说明可能有内存泄漏,例如循环引用的对象、不断追加的静态数组或者未释放的资源句柄。此时可以先尝试对单个 Worker 执行 php start.php reload,让 Worker 平滑重启释放内存;如果 reload 之后内存暂时下降,但运行一段时间后又上涨,就需要回到代码中寻找泄漏点。
status 命令与并发连接查看的配合
除了 status,Workerman 还提供了 connections 命令,用于查看当前所有连接信息。两者配合使用时,先用 status 看全局和进程级指标,再用 connections 查看具体连接对象。比如 status 显示某个 Worker 的 connections 数量异常高,此时执行 php start.php connections 可以得到套接字列表,从来源 IP、连接建立时间等维度判断哪些连接是正常业务连接,哪些可能是异常扫描或未释放的空连接。
但要注意,connections 命令输出的连接数量较多时也可能影响性能,因为它需要遍历当前连接表。因此在生产环境应避免频繁执行,更不要放在定时任务里每十秒跑一次。每次需要排查连接泄漏时,可以先通过 status 定位到问题进程,再针对该进程去查看连接详情。部分 Workerman 版本还支持指定进程 ID 查看连接,具体以官方文档为准。
总结与使用建议
把 status 命令当作 Workerman 服务巡检的第一入口,能减少很多不必要的猜测。执行 php start.php status 判断进程是否还活着,执行 php start.php status -d 深入查看每个进程的内存、连接、请求等指标。发现异常后,再结合日志、系统工具和 connections 命令进一步排查。这个方案不需要额外安装监控组件,适合快速响应线上问题。
当然,status 命令提供的是瞬时快照,无法完全替代长期监控。对于关键业务,建议仍然布置独立的进程监控和资源告警,例如 supervisor、systemd 或 Prometheus 等。status 命令更像是服务器上的第一手信息源,它的价值在于简单直接,不依赖外部服务。熟练掌握它的输出字段,可以让你在定位 Workerman 相关故障时节省大量时间。