5: WebSocket 层
Phlo Realtime 是守护进程内置的 WebSocket 服务器:守护进程拥有这些套接字,并在同一进程中运行您的 PHP 钩子。这就是它们如何结合在一起的,以及守护进程功能之间关系的良好模型。
5.1: 在进程中,而不是一个单独的服务
WebSocket 服务器(ws 库)位于守护进程内部。它持有连接、客户端注册表和 /message 广播桥,并且不运行自己的 PHP:对于每个套接字事件,它在守护进程自己的池中以进程内方式调度匹配的 websocket::<hook> 目标。因此,一次性与常驻的选择仅仅是主机的构建模式(守护进程已经为该主机所做的),而不是单独的 WebSocket 设置;调度路径在两种情况下是相同的。
它通过守护进程的注册表将每个连接的 Host 解析为一个应用程序,主机到应用程序的映射在 config/daemon.js 中声明(守护进程的第四个参数)。没有条目的主机会导致调度失败,从而导致升级失败。
5.2: 事件流
| Socket 事件 | 作为 | 备注 |
|---|---|---|
| handshake | websocket::auth |
在接受 socket 之前运行;显式的 false(或抛出错误)会拒绝它。缺少 token cookie 会直接拒绝。 |
| accepted | websocket::connect |
设置;这里的 false 会关闭 socket。 |
| message | websocket::receive |
以 stream: true 发送,因此打印的行会在生成时流回发送者。 |
| disconnect | websocket::close |
清理。 |
引擎的 websocket 资源将这些目标映射到您的普通 wsAuth / wsConnect / wsReceive / wsClose 函数;缺少函数意味着“接受并不做任何事”。这是应用程序端的完整故事,涵盖在 WebSocket 手册 和 指南的 WebSocket 章节 中。
5.3: 其他关系
- 运行时助手 在
app路径上通过 HTTP 调度,当daemon常量被设置时(见前一章)。 - 调度器 内置于守护进程中(前一章),替代
tasks::run和fleet::poll的 cron。 - Phlo WhatsApp 保持其独立服务。WhatsApp 网关保持一个持久的电话会话,这不是一个工作池任务,因此守护进程不运行它;它被监控,而不是被吸收。
5.4: 运行它
守护进程是一个进程。在监控程序下运行它:
pm2 start config.js --name phlo-daemon
pm2 save
它绑定到本地主机;在您的反向代理处终止 wss:// 并将 /websocket 转发到守护进程的端口。