【问题标题】:Websocket advantages over AJAX for simple applications with PHP对于使用 PHP 的简单应用程序,Websocket 优于 AJAX
【发布时间】:2012-11-25 17:52:29
【问题描述】:

我已经在 PHP 中使用了一些 AJAX 来处理诸如提交表单之类的事情,并且我最近开始研究 websockets。我跟着this tutorial 了解了基础知识。据我所知,websockets 保持连接打开,而 AJAX 打开和关闭请求。

我的问题是,如果您只是提交表单或像 auto_complete 之类的简单任务(无论如何都有一个 jQuery 插件),那么 websockets 是否比 AJAX 提供任何优势?也许本教程不是最好的,但似乎要让 websockets 工作(至少使用 PHP)涉及更多的代码,而不仅仅是一个简单的 AJAX 调用(或使用捆绑它的 jQuery)。我在几个地方读到它会更快一些,但如果我正在处理一些没有收到大量请求的东西,它真的会有所作为吗?如果我错了,请纠正我,但并非所有浏览器都支持 websocket,对吧?

【问题讨论】:

  • 我觉得文章本身总结的很好:Websockets can replace long-polling ...
  • 假设您要自动检查是否有新评论自动添加到文章底部;长轮询意味着您将每 xx 秒检查一次是否有新内容,使用 web-sockets cmets 可以在发布时自动进入。
  • @jeroen 谢谢,这是有道理的。我可以理解诸如检查消息或更新之类的事情,但是如果您只是提交表单,那似乎没有什么区别。是否需要更多代码来设置,还是这个例子很笨拙?
  • 客户端非常简单,问题是您需要设置服务器并为不支持 websockets 的浏览器提供与以前相同的 ajax 解决方案。
  • 所以你是说如果浏览器不支持 websockets,你需要设置你的服务器才能提供上述浏览器信息?...本质上意味着它是可能的,只是一些额外的工作吗?

标签: php jquery ajax websocket


【解决方案1】:

Websocket 有两个优点。

  1. 它们的开销要少得多,从而带来更好的网络性能

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

第二个是最重要的优势。

在 AJAX 中,服务器发送的所有内容都必须是对客户端先前请求的响应,并且每个请求只能被响应一次。但是在许多应用程序中,尤其是多用户应用程序中,事件发生在服务器上,这些事件必须立即推送到客户端。在 AJAX 中有一些解决方法,比如延迟对请求的回答,直到有东西要报告(长轮询),但这些都很脏。这就是为什么有 Websockets 的原因。使用 websocket 连接,服务器可以在需要时随时向客户端发送消息,而无需等待来自客户端的请求。

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

  1. Web 开发框架还没有很好地支持它们(还没有!)
  2. 并非所有网络浏览器都支持它 (but most desktop browsers already do)
  3. 许多代理和反向代理无法中继 websocket 流量(还没有!)

【讨论】:

  • 此页面顶部的“堆栈交换”图标是否使用 websockets(收到新消息时)?我看到了这样的好处,但如果你只是提交表单,它似乎并没有太大的区别。代码明智的 websockets 似乎更麻烦。只是我列出的示例似乎是这种方式吗?使用 3-4 行 jQuery,我可以使用 ajax 发布信息。我喜欢 websockets 的想法,肯定会进一步研究它们。
  • 对于一个简单的表单提交,我宁愿建议使用 AJAX,因为在这种情况下,服务器只会 react 对客户端的操作,而不是 act 独立。
【解决方案2】:

其实,AJAX 和 websockets 是两个不同的类别。 AJAX 是一种概念,一种技术。使用 AJAX,您可以执行(作为首字母缩略词的意思)异步请求,因此浏览器不需要重新加载/刷新整个页面。这对不同的事情有好处,例如检查表单输入。 Websockets 是一种协议,技术上与 http 完全一样,除非连接不会在传输后关闭。这对于网络服务器可能需要联系客户端(http 不能这样做)的事情很有用,例如推送服务(聊天或邮件客户端,即使用户不刷新,您也希望更新用户界面页面或游戏)。而且它消除了 http 开销,因为整个事情只需要在开始时完成一次。

因此,它们用于不同的目的,即使它们重叠。对于您的自动完成,我认为它不会对性能产生真正的影响。它甚至是一个动作/反应的事情,所以用户输入或提交(无论什么)可能导致请求的内容,服务器就会做出响应。

【讨论】:

    【解决方案3】:

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

    除非您有需要 websocket 的要求,例如全双工双向通信,否则您最好使用现有的基于 AJAX 的解决方案。

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

    【讨论】:

    • 由于当今大多数桌面浏览器自动更新,AJAX 回退逐渐变得不那么重要。唯一仍然存在的有问题的平台是 1. IE9(这尤其成问题,因为 IE10 不适用于 Windows XP 和 Vista 用户)和 2. 任何 Android 设备(众所周知,这些设备对更新不友好)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-26
    • 1970-01-01
    • 2018-11-20
    相关资源
    最近更新 更多