PHP SSE 与 PHP WebSockets(棘轮)

NVG*_*NVG 8 php websocket server-sent-events ratchet

我将在几周内开始开发多人纸牌游戏,在那之前,我正在研究可用的最佳技术。我将在服务器端使用 PHP+MySQL,在客户端使用 JS/HTML5。游戏也将通过手机浏览器播放。

我的游戏玩法涉及 4 个或更多用户在一张桌子上玩游戏,每个人最多有 30 秒的时间来采取行动。将有多张桌子可用,并且一个用户可以同时玩 1 张以上的桌子。

根据我的研究,每次其他玩家进行操作时,通过让服务器通过 SSE 推送数据来同步客户端与服务器似乎很容易。然后当当前玩家采取行动时,请求数据将通过 XMLHttpRequest 从客户端发送到服务器,然后通过 SSE 同步到其他玩家。

现在从我读到的内容来看,这有一个很大的缺点,因为对于每个侦听 SSE 进程的播放器,连接在服务器上保持打开状态,消耗大量内存。我将构建的应用程序旨在随着时间的推移在具有现代硬件(8 核 CPU,64GB RAM)的专用服务器上支持 10000 多名玩家。有些人可能会说 PHP 不适合这个,但这里的争论是如何使用 PHP 来完成这项工作。

SSE 实现的替代方案是使用 Websockets(我目前正在检查 Ratchet 并设法从文档中设置了聊天服务器),但总的来说,我有一些困境阻止我做出决定:

  1. Websockets:建立握手时,服务器上的连接也保持打开状态,与 SSE 中相同,但我猜这是一种不同类型的连接,消耗较少的内存。那正确吗?所以 websockets 会更有效率。对 SSE 和 WebSockets 的内存使用情况有任何估计吗?我在某处读到通过 SSE 的每个连接将使用 APACHE 和 PHP 消耗大约 20mb。对于 10000 个用户(太多),这将是 200GB。我希望我错了。我不知道套接字连接会消耗多少内存。我的意思是一个空闲的。

  2. SSE 会消耗更多的电池(在手机上)并且会比套接字连接产生更多的网络流量吗?

  3. SSE:如果用户将在两张桌子上玩,我是否需要打开两个 SSE 进程(每个桌子一个),或者如果我请求 table1 或 table2 的数据,我如何告诉 SSE 进程?或者我被迫同时接收所有表的数据?接收用户现在处于活动状态的所有表的数据不会有问题,但我很好奇是否有自定义方法。

  4. 与互联网连接不稳定的人打交道如何?websockets 是否支持自动重连?或者这需要从客户端手动完成?

Abd*_*rai 3

1) WebSockets 和 SSE 都保持连接打开吗?

是的。只要服务器配置为这样做,或者连接被客户端或服务器关闭,WebSocket 和 SSE 都会保持连接打开。因为很多时候,服务器默认配置为在空闲时间超过配置中指定的时间时关闭连接。

2)如果两者都保持连接打开,那么两者的内存消耗和网络开销是否相同?哪一种更轻、更快?

首先,两者在连接建立方面似乎共享相同的资源,因为两者都必须第一次握手并通过 ping 检查心跳,然后休息是正常的单个 TCP 连接。

但有一点需要注意,Websocket 是双向的,而 SSE 是单向的,因此即使 SSE 连接处于活动状态并且您必须从客户端向服务器发送一些数据,那么您也必须使用某种 XHR将再次创建另一个到服务器的连接。创建连接是资源密集型的。因此,当涉及到双向时,WebSockets 似乎更擅长资源利用,就像上述多人纸牌游戏的 OP 案例一样。这也使得 WebSocket 比 SSE 更快、更轻。当您只需从服务器向客户端发送数据(例如股票市场价格、游戏得分等)时,SSE 就非常有用。

3) 如果您的首选是 WebSocket 那么我们需要担心 URL 重写、响应标头等

我不这么认为,因为如果 WebSocket 与 PHP 一起使用,那么大多数时候它是基于 CLi 的单独 PHP 脚本,带有连接到 ws://example.com:8092/websocket.php 之类的 Websocket。因此,我认为不必再担心 URL 重写或响应标头。而且我认为如果需要的话,可以通过 PHP 脚本本身添加/修改标头。

4) SSE 会比套接字连接消耗更多电池(在手机上)并且会导致更多网络流量吗?

与 WebSocket 相比,我认为 SSE 不会消耗更多电池。但是,它肯定会产生更多到服务器的流量,因为如上所述,SSE 是单向的,从客户端到服务器的每个数据都会创建另一个到服务器的连接。

5)如何处理互联网连接不稳定的人?websockets支持自动重连吗?或者这需要从客户端手动完成?

有一些技术可以处理这部分,以便在这种情况下重新连接。