要让Swoole服务具备实时监控能力,必须打通数据采集、传输、消费与前端可视化四个环节:用swoole_timer_tick低频调用$server->stats()采集connection_num、accept_count、tasking_num等关键指标并补时间戳;推荐通过Kafka缓冲实现服务端主动推送;前端用WebSocket连接接收JSON数据,结合ECharts动态渲染图表并合理配置动画与坐标轴。

要让Swoole服务具备实时监控能力,必须打通数据采集、传输、消费与前端可视化四个环节,不能只依赖单一接口或工具——stats()返回的是快照值,WebSocket推送需要连接管理,ECharts刷新依赖结构化数据流,缺一不可。
用$server->stats()获取实时运行快照
这一步不是每请求都调,而是按需低频拉取。高频调用会反向拖慢QPS,尤其在高并发场景下,stats()本身不耗时,但频繁调用叠加协程调度开销会明显抬升延迟。
在服务启动后,用swoole_timer_tick每5秒触发一次采集:swoole_timer_tick(5000, fn() => file_put_contents('/tmp/swoole_stats.json', json_encode($server->stats())));
【connection_num、accept_count、tasking_num这三个字段必须保留,它们分别代表当前活跃连接、总接入数、正在执行的Task数量,是判断服务是否积压的核心依据】
注意:stats()不带时间戳,你要自己补;worker重启后计数清零,不能直接当累计值用。
用Swoole WebSocket+Kafka构建推送链路
单纯暴露/stats接口只能被动查,无法做到浏览器端自动刷新。必须建立长连接通道,由服务端主动推。
方法一:Kafka作缓冲层,Swoole Consumer从metrics主题拉数据→遍历$clients表→逐个push
方法二:绕过Kafka,用Swoole\Table做内存广播池,在onRequest中检测路径为/debug/push时,把当前stats()结果广播给所有已建立连接的fd
Swoole 6.1.1 是一个专为 PHP 设计的高性能事件驱动并发网络引擎。作为稳定版,它修复了编译时对 zlib 依赖的缺失及 curl 模块的内存安全风险。该版本支持协程、多线程与多进程架构,内置 TCP/HTTP/WebSocket 服务器,能够显著提升 PHP 在微服务、实时通信等场景下的执行效率与并发能力。
方法三:用Swoole\Process启动独立监控进程,定时调stats()→写入Redis List→主Server用tick监听该List长度变化→有新数据就pop并推送
推荐方法一,它解耦了业务打点与监控消费,即使WebSocket服务短暂中断,Kafka也能暂存数据不丢失。
前端用ECharts实现动态刷新
第一步:引入CDN版ECharts和WebSocket客户端库
第二步:建立WebSocket连接到ws://your-domain:9502,连接成功后发送心跳保活帧(空字符串或pong)
第三步:监听message事件,用JSON.parse解析收到的数据,提取time、cpu、mem、qps字段→塞进ECharts的series.data数组→调用myChart.setOption更新图表
第四步:设置option中的animationDuration为300,避免图表跳变;xAxis.type设为'category',data用最近10条time字段生成;yAxis.max根据指标类型动态设为100(CPU/MEM)或10000(QPS)
第五步:在window.onbeforeunload里调用websocket.close(),防止页面关闭后连接残留占用fd

















