【问题标题】:Long Polling or WebSockets长轮询或 WebSockets
【发布时间】:2013-08-11 14:21:32
【问题描述】:

我正在编写网络聊天,您可以在其中与屏幕上的人同时进行多次一对一的对话。 (基本上就像个人信使一样,没有群聊)。

我的技术选项似乎是 Long Polling 和 WebSockets,我正在尝试选择。

长轮询的好处是它很容易实现,我可以返回我想要的任何数据(一个自定义的 JSON 对象,其中包含更新页面所需的数据)。

我对 WebSockets 的恐惧在于 PHP 中没有原生库,因此您必须在不同的 3rd 方库之间进行购买,而且这些概念似乎更复杂,通道和订阅是什么以及您有什么。

浏览器兼容性对我来说不是问题。

  1. Long Polling 的性能是否比 Websockets 差很多?如果不是,那我的决定很简单!

  2. 是否有一个非常简单的 PHP Websocket 服务器?还是这个概念很简单,我可以自己写? (Mozilla 有一个非常简单的tutorial 用于编写客户端,但不是在服务器上)。

【问题讨论】:

  • nginx 支持网络套接字。安装那个并使用它将数据传递给您的 php 脚本?替代方案是 Node.js,它很容易运行并使用 JSON 数据进行回复。看到您在谈论 JSON,我假设您已经熟悉 javascript 到可以有效使用 Node 的程度。至于用 PHP 编写的实际服务器 - 太麻烦了,相信我。
  • @N.B.:我已经在使用 nginx。那么使用 nginx Websocket 支持消除了对套接字服务器的需要吗?我只是使用 nginx 配置将数据传递到正确的位置?如果是这样的话,听起来好得令人难以置信。我也想听听性能方面的信息。
  • 为什么不用现有的服务器,只写前端?
  • @forthrin 来自他们在 nginx 网站上写的内容,它支持该协议,因此它是一个 Web 套接字服务器。我没试过。另一方面,您可以用 PHP 编写自己的服务器。它只是一个简单的套接字监听端口,必须通过挑战。 PHPWebsocket 拥有一切,您可以将其用作您的基础并进行调整。如果您精通 js,那么 Node.js 可以让您非常轻松地使用 websocket。

标签: php websocket phpwebsocket


【解决方案1】:

假设您的长轮询方案涉及由与前端相同的 Web 服务器托管的端点,这将意味着应用程序的每个用户都有两个活动连接,因此您基本上可以将可以支持的用户数量减少一半.您的 websocket 服务器将在不同的端口上运行,并且可以绕过您的 web 服务器,因此使用 websocket 可以节省大量的连接开销。

websockets 节省开销的另一个地方是,一旦建立连接,就不需要不断的请求和响应。 Zombie websocket 连接在带宽和 CPU 方面基本上是免费的。

最后,我认为长轮询不会更容易实现。由于 websocket 旨在完全按照您的要求进行设计,因此我认为利用现有的 websocket 包实际上会为您节省一些代码行。如果您想使用 PHP,我会查看 Ratchet(功能丰富)或 phpwebsocket(精简版)。

【讨论】:

  • 我试过 phpwebsocket,但是 server.php 没有收到“Sec-WebSocket-Key1”和“Sec-WebSocket-Key2”。你知道我怎么解决这个问题吗?
【解决方案2】:
  1. 长轮询肯定比 Werbsockets 差得多。
  2. 不建议将任何 websockets 库与 PHP 一起使用,特别是用于聊天应用程序。

我建议改用 Python、Ruby 或 Node.js。

【讨论】:

  • 服务器库实际上可以是任何语言,但我自己的与数据库通信的服务器代码是 PHP,我更喜欢这样(尽管它不是绝对必须的)。 Node 是不可能的,但我对 Ruby 的了解还不错。 Python 我还没接触过。
  • 但我猜你还没有开始。我更喜欢 Node.js,因为它的性能和简单性。但是,如果您决定使用它,我可以帮助您。如果你想要 Ruby,那么我建议使用这个 library,如果你坚持使用 PHP,这里有一个不错的简单 websockets library
  • 您能否详细说明为什么不建议将 PHP 用于您提到的 websockets 和语言?你从来没有写过这是你的个人观点,所以我假设你必须有一些事实来支持你的说法?
  • Websockets“还没有”流行,我尝试将 websockets 与 python、PHP 和 Node.Js 一起使用,统计上最后一个在我的不同情况下具有最佳性能(聊天应用程序、用户分析和Android 上的推送通知),我不知道这仍然算作个人意见,但您可以查看此article
  • 好的,这是 Apache 后面的 PHP 针对单线程事件循环服务器进行测试的。这就像将我的鼠标与一瓶啤酒进行比较。我在这里仍然看不到任何正确的事实。例如,正确的测试是 Node vs PHP 在 Mongrel2 后面使用 LibEV,所以我们稍微平衡了竞争环境。我可以为您提供在这种设置中让 Node 大吃一惊的结果。但是,我仍然想知道,具有套接字功能的一种语言比具有相同套接字功能的另一种语言差的事实在哪里。
猜你喜欢
  • 1970-01-01
  • 2012-07-07
  • 2017-11-30
  • 2012-10-22
  • 2015-09-14
  • 2011-06-18
  • 2011-03-22
  • 1970-01-01
  • 2013-08-08
相关资源
最近更新 更多