PHP SSE与PHP WebSockets(Ratchet)的比较

8
我将在几周内开始开发一款多人卡牌游戏,目前正在研究可用的最佳技术。我将使用PHP+MySQL作为服务器端,JS/HTML5作为客户端。游戏也将在移动浏览器上进行。
我的游戏玩法涉及4个或更多用户在桌子上玩,每个用户有30秒钟的时间来采取行动。将会有多张桌子可供选择,用户可以同时在多张桌子上玩。
从我的研究中得知,通过让服务器通过SSE推送数据,就可以很容易地将客户端与服务器同步,每当另一个玩家采取行动时,服务器就会推送数据。然后当当前玩家采取行动时,请求数据将通过XMLHttpRequest从客户端发送到服务器,然后通过SSE同步到其他玩家。
现在从我读到的内容来看,这种方法有一个很大的缺点,因为每个监听SSE进程的玩家都会在服务器上保持连接,消耗大量内存。我要构建的应用程序旨在支持10000个以上的玩家在一台配备现代硬件(8核CPU、64GB RAM)的专用服务器上运行,随着时间的推移。有些人可能会说PHP不适合这个,但这里的争论是如何使用PHP使其正常工作。
SSE实现的替代方案是使用Websockets(我正在检查Ratchet,并设法从文档中设置聊天服务器),但总体上我有一些困惑,阻止我做出决定:
1. WebSockets:在建立握手时,服务器上也会保持连接,与SSE相同,但我想这是一种消耗更少内存的不同类型的连接。这样WebSockets将更有效率。对于SSE和WebSockets的内存使用量有什么估计吗?我在某个地方读到,每个通过SSE连接都会消耗大约20MB的APACHE和PHP。那对于10000个用户来说就需要200GB(太多了)。我希望我是错的。我不知道一个空闲的套接字连接会消耗多少内存。
2. SSE会比套接字连接消耗更多电池(在手机上)并且会导致更多的网络流量吗?
3. SSE:如果一个用户在两张桌子上玩,我需要开启两个SSE进程(每个桌子一个),还是如何告诉SSE进程我正在请求table1或table2的数据?或者我被迫同时接收所有桌子的数据?接收当前用户活跃的所有桌子的数据不是问题,但我很好奇是否有自定义的方法。
4. 如何处理网络连接不稳定的人?Websockets是否支持自动重连?还是需要从客户端手动操作?

1
说实话:太长不看。如果您缩小问题范围并更快地进入重点,将有助于您获得答案。 - deceze
你的问题描述过于冗长,没有任何简化的尝试,我猜测你的问题可能太过宽泛了。 - Epodax
@deceze的问题已经被简化。 - NVG
现在好多了,至少它现在适合一个屏幕。 它可能仍然有点太广泛和讨论性,以至于无法真正回答。 就个人而言,我没有使用SSE的任何经验,但是我已经使用Autobahn / WAMP / Crossbar和Python构建了成功的实时服务(Node.js也可以胜任)。 对于此类应用程序,传统的PHP / MySQL架构确实不是正确的选择; 服务器应该是单个不断运行的进程(或几个进程),以在内存中管理游戏状态,而不是基于单个请求的(PHP 可以做到这一点,但并不理想)。 - deceze
2
哈哈,那些回避问题并因为看不懂而责怪篇幅过长的人真是好笑。这个问题很好。"就我个人而言,我没有任何关于SEE的经验。" - NiCk Newman
显示剩余4条评论
1个回答

3

1) WebSocket和SSE都会保持连接吗?

是的。无论是WebSocket还是SSE,只要服务器被配置为保持连接或者由客户端或服务器关闭,它们都会保持连接。因为很多时候,服务器默认配置为在闲置时间超过配置中指定的时间后关闭连接。

2) 如果两者都保持连接,那么它们是否具有相同的内存消耗和网络开销?哪一个更轻量级和更快?

首先,两者似乎在连接制作方面共享相同的资源,因为两者都必须进行握手并通过ping检查心跳,其余则是普通的单个TCP连接。

但是有一个重要的点需要注意,WebSocket是双向的,而SSE是单向的,所以即使SSE连接仍在运行,您必须从客户端向服务器发送一些数据,您仍然必须使用某种XHR,这将再次创建到服务器的另一个连接。创建连接是资源密集型的。因此,当这涉及双向传输时,像上面OP卡牌游戏多人游戏的情况,WebSockets似乎更好地利用资源。这也使得WebSockets比SSE更快且更轻量。如果只需将数据从服务器发送到客户端,例如某些股票市场价格、游戏得分等,则SSE很好。

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

我认为不需要,因为如果将WebSockets与PHP一起使用,则大多数情况下它是一个基于CLI的单独的PHP脚本,其中WebSocket连接到类似ws://example.com:8092/websocket.php这样的东西。因此,我认为不需要更多担心URL Rewrite或者响应头。而且,如有需要,PHP脚本本身可以添加/修改标头。

4) SSE会消耗比sockets连接更多的电池(在移动电话上),并且会导致更多的网络流量吗?

我认为相对于WebSockets而言,SSE不会消耗更多的电池。但是它肯定会创建更多的流量到服务器,因为如上所述,SSE是单向的,并且每个来自客户端的数据都会创建到服务器的另一个连接。

5) 如何处理具有不稳定互联网连接的人?WebSocket是否支持自动重新连接?还是需要由客户端手动完成?

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接