使用PHP的简单应用程序中,Websocket相对于AJAX的优势

7
我曾经在PHP中使用过一些AJAX技术,例如提交表单,最近我开始研究Websockets。我按照这篇教程了解了基础知识。据我所知,Websockets保持连接打开状态,而AJAX则会打开和关闭请求。
我的问题是,在提交表单或像自动完成这样的简单任务时,如果只是使用AJAX,Websockets是否提供任何优势(反正有一个jQuery插件)?也许这篇教程不是最好的,但是似乎要使Websockets工作起来(至少与PHP一起使用),需要编写更多的代码,而仅使用简单的AJAX调用(或使用捆绑它的jQuery)就可以了。我已经在几个地方读到过它更快的说法,但是如果我正在处理的内容没有接收大量请求,那么它真的会有所不同吗?请纠正我如果我错了,不是所有的浏览器都支持Websockets,对吗?

我认为这篇文章已经很好地总结了:Websockets可以取代长轮询... - jeroen
假设您想自动检查是否有新评论,并将其自动添加到文章底部;长轮询意味着您每隔xx秒就会检查是否有新内容,而使用WebSockets,评论可以在发布时自动进入。 - jeroen
@jeroen 谢谢,这很有道理。我可以理解检查消息或更新之类的东西,但如果你只是提交表单,似乎并没有什么区别。它需要更多的代码来设置,还是那个例子只是笨重的? - user1104854
1
客户端非常简单,问题在于您需要设置服务器并为不支持WebSockets的浏览器提供与之前相同的Ajax解决方案。 - jeroen
1
那么你的意思是,如果浏览器不支持WebSockets,你需要设置服务器以能够提供所需的浏览器信息?这基本上意味着这是可能的,只是需要额外的工作? - user1104854
3个回答

21

Websockets有两个优点。

  1. 它们具有更少的开销,从而提高了网络性能。

  2. 它们允许服务器发送客户端没有明确请求的数据。

第二个是最重要的优点。

在AJAX中,服务器发送的每个内容都必须是客户端先前请求的响应,并且每个请求只能被回答一次。但在许多应用程序中,特别是多用户应用程序中,服务器上会发生事件,这些事件必须立即推送到客户端。在AJAX中有一些解决方法,比如延迟响应请求直到有东西要报告(长轮询),但这些方法相当不好。这就是为什么有Websockets。通过websocket连接,服务器可以在想要和多频繁时向客户端发送消息,而无需等待客户端的请求。

但不幸的是,WebSockets也有缺点:

  1. 它们还没有得到网络开发框架的很好支持(但未来可能会有!)
  2. 并非所有的网络浏览器都支持它(但大多数桌面浏览器已经支持
  3. 许多代理和反向代理无法转发websocket流量(但未来可能会有!)

1
这个页面顶部的"stack exchange"图标在接收到新消息时使用WebSockets吗?我能看出它对这样的功能有好处,但如果只是提交表单的话似乎没有太大的区别。从代码上来看,WebSockets似乎更加繁琐。是不是只有我列出的这个例子才会这样?用3-4行jQuery代码,我就可以使用ajax发布信息。我喜欢WebSockets的概念,一定会进一步研究它们。 - user1104854
2
对于简单的表单提交,我更建议使用AJAX,因为在这种情况下,服务器只会对客户端的操作做出反应,而不会自行执行操作。 - Philipp
现在我们已经到了2022年:全球使用率:97.44%(来自 caniuse)浏览器对于WebSockets的支持。这几乎消除了第一项不利因素。 - WebDevPassion
1
@WebDevPassion 浏览器支持将是第二个劣势。 - Philipp

9
实际上,AJAX和Websocket是两个不同的类别。AJAX是一个概念、一种技术。使用AJAX可以执行(正如缩写所表示的)异步请求,因此浏览器无需重新加载/刷新整个页面。这对于不同的事情很有用,例如检查表单输入。
Websockets是一种协议,从技术上讲与http相当,除非连接在传输后不会关闭。这对于那些Web服务器可能需要联系客户端的事情很有用(http不能做到这一点),例如推送服务(聊天或邮件客户端,在用户不刷新页面时想要更新用户界面,或者游戏)。它消除了http的开销,因为整个过程只需在开始时完成。
因此,它们是为不同的目的而设计的,尽管它们有重叠之处。对于您的自动完成,我认为性能上不会有真正的区别。它甚至是一种动作/反应的事情,因此用户输入或提交(任何)可能会引起请求,服务器响应。

1

Websockets是一项强大的技术,可以满足您提到的有限用例,但旧版浏览器和网络中介可能存在兼容性问题。实际上,有些人甚至建议在不支持Websockets的情况下使用HTTP回退。

除非您有必要使用Websockets进行全双工双向通信等需求,否则最好使用现有的基于AJAX的解决方案。

如果您需要向用户界面推送通知,则Websockets可能是一个好主意,但如果您只是寻找表单提交和自动完成,那么这些问题已经通过Ajax得到了解决。


1
由于现在大多数桌面浏览器都会自动更新,因此AJAX回退渐渐变得不那么重要了。唯一仍然存在的问题平台是1. IE9(特别棘手,因为IE10不适用于Windows XP和Vista用户)和2.任何Android设备(其更新友好性著名欠佳)。 - Philipp

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