无限循环的 Websocket。它真的比ajax更好吗?

OTA*_*TAR 3 php ajax websocket

我正在尝试了解网络套接字。

我在 doc这里看到了两个例子。

这两个示例都使用无限循环,侦听新客户端何时连接、何时执行有趣的操作以及何时断开连接。

我的问题是:使用 websockets(无限循环)是否比每次 x 次发出 http 请求的 ajax 解决方案更好?

Ghe*_*unk 5

AJAX 和 WebSocket 有很大不同。问一个是否比另一个更好,就像问螺丝刀是否比锤子好一样。

WebSocket 用于实时、交互式通信。WebSocket 连接的双方都可以发送数据,另一端将在几毫秒内收到数据。连接保持打开状态,从而减少由于连接协商而导致的延迟。

然而,它只能与 HTTP 配合得很好。也就是说,它可以与支持 WebSocket 的代理以及防火墙很好地配合。WebSocket 流量绝对不是 HTTP 流量,除了客户端的第一个数据包,该数据包请求从 HTTP 切换到 WebSocket 协议。

另一方面,AJAX 是纯 HTTP。AJAX 和标准 Web 请求之间的唯一区别是 AJAX 请求是由客户端脚本发起的,并且响应可用于同一脚本而不是重新加载页面。

在 AJAX 和 WebSocket 中,客户端脚本都可以接收数据并在同一脚本中使用它。相似之处就到此为止。

WebSockets建立了永久连接,双方可以随时发送数据,或者随时静坐。使用 AJAX,客户端发出请求,服务器响应。

例如,如果您要设置一个新消息通知系统,如果您使用的是 WebSocket,那么一旦有新消息可用,服务器就会将其直接发送到浏览器。如果没有新消息,服务器将保持安静。如果您使用 AJAX,客户端会定期向服务器发送请求,服务器始终会响应,要么说没有新消息,要么发送待处理的通知。服务器无法在其端发起事务,它必须等待 AJAX 请求。

服务器端,与传统的 PHP Web 开发范例有所不同。典型的 WebSocket 服务器是作为守护进程运行的独立 CLI 应用程序。(如果最后一句话没有意义,请花一些时间来真正了解如何管理服务器。)

这意味着多个客户端将连接到同一个脚本,并且像$_GET和 这样的超全局变量$_SESSION将完全没有意义。在一个小用例中似乎很容易概念化,但请记住,您很可能希望从站点的其他部分获取信息,这通常意味着使用完全没有访问 HTTP 请求之外的数据概念的库和框架/响应模型。

因此,为了简单起见,您通常会希望坚持使用 AJAX 请求和定期轮询,除非您有办法重新考虑网络数据,并可能重新实现库自动化的操作(如果您希望更新标准 Web 流量) 。

至于服务器的循环:

这不是一个繁忙的循环,而是一个IO阻塞循环。

如果服务器尝试读取网络数据但没有可用的数据,则操作系统将阻止(暂停)脚本并继续执行其他需要执行的操作。在我的 WS 服务器中,我每次最多阻止等待网络流量 1 秒,然后脚本返回检查并查看是否发生了其他我应该通知客户的新情况。通常,只需几毫秒,服务器就会立即返回 IO 阻塞状态,等待线路上的新数据。其他一些人使用 LibEv 实现了我的服务器,这允许他们响应网络 IO 之外的事件,而不必等待块超时。

几乎每个服务器都是这样做的。这就是为什么您可以让 Apache 主动侦听和服务 Web 流量,而无需每台运行 Apache 的服务器都保持 100% CPU 使用率,即使没有流量也是如此。

最后,WebSockets 是一项很棒的技术,但 Web 库和框架根本不是为了使用它们而构建的。因此,除非您工作的系统中等待 3 秒等待完整的 AJAX 请求的时间太长,否则最好使用 AJAX。如果您正在编写多人互动游戏或聊天系统,那么您已经找到了 WebSocket 的完美用途。

我衷心鼓励每个人学习 WebSockets……但这并不是灵丹妙药,而且网络的某些部分的设计方式很少能让人们真正利用它。