← 所有帖子
Phlo Realtime:无需离开语言即可使用 WebSockets

Phlo Realtime:无需离开语言即可使用 WebSockets

大多数框架将实时视为附加在第一层上的第二个堆栈:一个单独的 WebSocket 服务器,一个单独的事件总线,以及一个单独的“推送内容”的思维模型。相反,Phlo Realtime 的构建是为了实现增量式的。一个 Phlo 应用在 Phlo Daemon 运行时是一个正常的请求-响应应用,只有在那时,实时层才会被激活。

一个进程,多个应用

守护进程拥有套接字连接。它是一个单一的进程,跨越机器上配置的每个应用复用 WebSocket 连接,并将每个事件(连接、接收、关闭)作为对工作池的全新、干净的调用分派给正确的应用。你不需要编写套接字循环;你只需实现四个钩子,守护进程会调用它们。

method wsConnect($conn) => %session->user ? true : false
method wsAuth($conn, $token) => user::record(token: $token)
method wsReceive($conn, $data) => wsCast('poll:'.$conn->room, votes: poll::tally($conn->room))
method wsClose($conn) => void

wsConnect 决定是否允许连接。wsAuth 根据令牌解析另一端的身份,如果你需要身份验证。wsReceive 处理传入的消息。wsClose 在客户端断开连接时进行清理。这些都不要求你学习新的运行时:这些是 Phlo 方法,像任何路由一样调用。

广播是一个调用

另一部分是从普通 PHP 推送。wsCast() 将有效负载广播到订阅了某个频道的每个连接,可以在你的应用程序中的任何地方进行,包括完全不相关的 HTTP 请求:

method vote($option){
    poll::castVote($option)
    wsCast('poll:'.$this->room, votes: poll::tally($this->room))
}

一个正常的 POST /vote 处理程序运行,更新数据库,并在同一请求中将新的投票结果推送到每个正在观看该投票的打开标签页。没有单独的发布/订阅客户端需要配置,也没有消息格式需要发明;守护进程和应用程序已经使用相同的协议进行通信。

设计上无状态

守护进程的工作池是套接字所在的地方,但数据保留在数据库中,而不是在守护进程内存中。每个事件都作为对当前状态的新调用运行,就像 HTTP 请求一样。这完全避免了一个棘手的问题:你永远不需要调和“这个长连接认为状态是什么”与“数据库实际说的是什么”,因为连接从不持有自己的状态而导致漂移。

端到端尝试

Learn 教程从零开始构建一个实时投票,分为八个步骤:安装、一个路由、一个视图,然后精确连接这四个钩子,最终形成一个投票,在一个标签页中的投票会立即更新每个其他打开的标签页。这是查看整个循环、通过广播连接的最快方式,而无需先阅读规范。

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