4: 套接字监控
因为每个连接都经过你的 hooks,你可以使用普通的 Phlo 模型查看和管理 sockets,无需特殊工具。
4.1: 存在
通过在 wsConnect 中写入一行并在 wsClose 中删除它来跟踪谁已连接:
function wsConnect($wsHost, $wsToken, $wsSocket){
type_presence::create(socket: $wsSocket, token: substr((string)$wsToken, 0, 8), since: time())
return true
}
function wsClose($wsHost, $wsToken, $wsSocket){
type_presence::delete('socket=?', $wsSocket)
}
实时计数就是 count(type_presence::records()),你可以在每次更改时将其广播给所有人。
4.2: 一个连接/断开连接的馈送
将每个生命周期事件附加到日志模型中,您将拥有审计跟踪和实时数据流。演示的 /monitor 页面呈现日志,并通过 wsCast 在套接字进出时更新在线计数和数据流。
| 想要 | 用途 |
|---|---|
| 在线计数 | count(type_presence::records()) |
| 每用户套接字 | 按令牌过滤存在 |
| 事件历史 | 一个 wslog 模型,最新的在前 |
| 定向推送 | wsCast(wsTarget: $socketOrToken, ...) |
4.3: 健康
在守护进程上执行 GET /health(例如 127.0.0.1:3001)会在一个地方报告连接侧和工作池,因为它们是一个进程:
{
"status": "ok",
"workers": 5,
"cap": 7,
"pools": {
"/var/www/app/release/www/app.php": { "workers": 4, "busy": 2, "queued": 0 }
},
"sockets": {
"app.example.com": { "tokens": 5, "sockets": 12 }
},
"registered": ["app.example.com", "dev.example.com"]
}
sockets 计算每个主机的活跃连接数(tokens 和 sockets);pools 是每个应用的工作者统计,其中 busy 是当前处理事件的工作者数量,queued 是等待空闲工作者的事件数量;workers/cap 是活跃总数与上限的对比。池会自动增长到上限,并收割闲置的工作者,因此如果 busy 处于上限而 queued 不断增加,意味着节点已达到容量。
4.4: 限制
Phlo Realtime 是守护进程内置的 WebSocket 层:一个进程拥有套接字并运行 PHP。在一次性模式下(build: true 应用),守护进程为每个事件启动一个处理程序,因此与保持状态在内存中的进程相比,每个事件的开销较小;将主机作为发布版本运行,守护进程从其常驻池中提供服务,消除了该开销并提高了吞吐量。无论哪种方式,您都保持与 Phlo 其余部分相同的无状态模型,并且没有额外的语言。对于非常高频的流媒体(每个套接字每秒多个事件),专用的流媒体服务器可能仍然更合适。