PHP SSE 与 PHP WebSockets( Ratchet )

标签 php websocket server-sent-events ratchet

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

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

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

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

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

  • Websockets:建立握手时,服务器上的连接也保持打开状态,与 SSE 中相同,但我猜这是一种不同类型的连接,消耗较少的内存。那正确吗?所以 websockets 会更有效率。
    对 SSE 和 WebSockets 的内存使用情况有任何估计吗?我在某处读到通过 SSE 的每个连接将消耗大约 20mb 与 APACHE 和 PHP。对于 10000 个用户(太多),这将是 200GB。我希望我错了。我不知道套接字连接会消耗多少内存。我的意思是一个空闲的。
  • SSE 会消耗更多的电池(在手机上)并且会比套接字连接产生更多的网络流量吗?
  • SSE:如果用户将在两张 table 上玩,我是否需要打开两个 SSE 进程(每个表一个),或者如果我请求 table1 或 table2 的数据,我如何告诉 SSE 进程?或者我被迫同时接收所有表的数据?接收用户现在处于事件状态的所有表的数据不会有问题,但我很好奇是否有自定义方法。
  • 与互联网连接不稳定的人打交道如何? websockets 是否支持自动重连?或者这需要从客户端手动完成?
  • 最佳答案

    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/

    相关文章:

    php - Jquery、ajax 和符号难题

    PHP 修剪和空间不起作用

    php - 如何使用php计算excel pmt

    c++ - 两个线程使用相同的 websocket 句柄——这会导致任何问题吗?

    javascript - 是否有 cubism.js + WebSocket 的教程或示例?

    浏览器的 WebSocket 连接建立错误

    javascript - 如何使用服务器发送的事件向多个用户广播,在客户端使用javascript,在服务器端使用java

    javascript - 使用带有nodejs的服务器发送事件并使用react的问题

    java - 服务器发送的事件在传入 React 时会成倍增加

    php - 从 mySQL 回显 HTML 时如何在递增和递减行之间切换