我将在几周内开始开发多人纸牌游戏,在那之前,我正在研究可用的最佳技术。我将在服务器端使用 PHP+MySQL,在客户端使用 JS/HTML5。游戏也将通过手机浏览器播放。
我的游戏玩法涉及 4 个或更多用户在一张 table 上玩游戏,每个人有 30 秒的时间来采取行动。将有多个可用的 table ,并且一个用户可以同时玩 1 个以上的 table 。
根据我的研究,每次其他玩家进行操作时,通过让服务器通过 SSE 推送数据来同步客户端与服务器似乎很容易。然后当当前玩家采取行动时,请求数据将通过 XMLHttpRequest 从客户端发送到服务器,然后通过 SSE 同步到其他玩家。
现在从我读到的内容来看,这有一个很大的缺点,因为对于每个监听 SSE 进程的播放器,连接在服务器上保持打开状态,消耗大量内存。
我将构建的应用程序旨在随着时间的推移在具有现代硬件(8 核 CPU,64GB RAM)的专用服务器上支持 10000 多名玩家。有些人可能会说 PHP 不适合这个,但这里的争论是如何使用 PHP 来完成这项工作。
SSE 实现的替代方案是使用 Websockets(我目前正在检查 Ratchet 并设法从文档中设置了聊天服务器),但总的来说,我有一些困境阻止我做出决定:
对 SSE 和 WebSockets 的内存使用情况有任何估计吗?我在某处读到通过 SSE 的每个连接将消耗大约 20mb 与 APACHE 和 PHP。对于 10000 个用户(太多),这将是 200GB。我希望我错了。我不知道套接字连接会消耗多少内存。我的意思是一个空闲的。
最佳答案
1) WebSockets 和 SSE 是否都保持连接打开?
是的。只要服务器被配置为这样做或者连接被客户端或服务器关闭,WebSockets 和 SSE 都会保持连接打开。因为很多时候,服务器默认配置为在空闲时间超过配置中指定的时间时关闭连接。
2)如果两者都保持连接打开,那么两者是否具有相同的内存消耗和网络开销?哪个更轻更快?
首先,在连接建立方面,两者似乎共享相同的资源,因为两者都必须第一次握手并通过 ping 检查心跳,其余的是正常的单个 TCP 连接。
但是有一点需要注意,Websocket 是双向的,而 SSE 是单向的,因此即使 SSE 连接处于事件状态并且您必须从客户端向服务器发送一些数据,那么您将不得不使用某种 XHR将再次创建到服务器的另一个连接。并且创建连接是资源密集型的。因此,当这是关于双向的时,WebSockets 似乎在资源利用方面更好,就像在多人纸牌游戏的上述 OP 情况下一样。这也使得 WebSocket 比 SSE 更快、更轻。当您只需要从服务器向客户端发送数据(例如某些股票市场价格、游戏分数等)时,SSE 就很好。
3) 如果您的首选是 WebSocket 那么我们是否需要担心 URL Rewrite, Response Headers 等
我不这么认为,因为如果 WebSockets 与 PHP 一起使用,那么大多数时候它是基于 CLi 的单独 PHP 脚本,带有连接到 ws://example.com:8092/websocket.php 之类的 websocket 的 websocket。所以,我不认为会有更多人担心 URL Rewrite 或响应头。而且我认为如果需要,PHP 脚本本身可以添加/修改标题。
4) SSE 是否会消耗更多的电池(在手机上)并且会比套接字连接产生更多的网络流量?
我认为与 WebSockets 相比,SSE 不会消耗更多电池。但是是的,它肯定会为服务器创建更多流量,因为如上所述,SSE 是单向的,从客户端到服务器的每个数据都会创建另一个到服务器的连接。
5) 与互联网连接不稳定的人打交道如何? websockets 是否支持自动重连?或者这需要从客户端手动完成?
那么有一些技术可以处理这部分以在这种情况下重新连接。
关于PHP SSE 与 PHP WebSockets( Ratchet ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34607936/