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: 其他关系

5.4: 运行它

守护进程是一个进程。在监控程序下运行它:

pm2 start config.js --name phlo-daemon
pm2 save

它绑定到本地主机;在您的反向代理处终止 wss:// 并将 /websocket 转发到守护进程的端口。

我们使用必要的cookie来使该网站正常工作。在您的许可下,我们还使用分析工具来改善网站。