【问题标题】:Server Side or Client Side Long Polling? [closed]服务器端还是客户端长轮询? [关闭]
【发布时间】:2014-04-02 17:23:09
【问题描述】:

long polling 的最佳做法是什么?

目前我设置的是javascriptxmlhttprequest 设置为serverPHP 运行服务器端检查是否有任何新内容并返回新内容或没有新内容变量。那么客户端会在收到返回值后等待n秒再发出另一个请求。

但是我在网上看到了很多不同的方法,如果 server 没有任何新的不要返回,而是等待 n 秒并再次检查对于新内容,直到一定次数的尝试然后返回新内容或不返回新内容,并且客户端在收到返回值后立即发出新请求。

那么,对于上述 2 种方法,哪一种方法是减轻服务器压力或节省更多服务器资源的最佳方法?我当前的设置还是第二个设置?或者也许是不同的方法?

谢谢!

【问题讨论】:

  • 看看你的真棒昵称,我会建议一个稍微不同的方法:dead polling
  • 第一种方法根本不是长轮询,它只是按时间间隔请求数据。如果你的间隔时间很长,比如 2-5 分钟或更长时间,间隔时间会更好。如果你的时间间隔很短,比如不到一分钟,那么长轮询会更好。
  • @letiagoalves 懒洋洋

标签: javascript php long-polling


【解决方案1】:

您的第一个选项根本不是长轮询,它只是每 n 秒发送一个请求。长轮询意味着您发送的请求会保持打开状态,直到达到超时或有新数据可用。

长轮询优于每 n 秒发送一次请求,因为数据更接近实时,无需每 秒发送一次请求。

通常在服务器端,您将通过使用睡眠循环来处理长轮询请求,该循环以短暂的延迟(例如 1 或 2 秒)重复检查数据库中的新数据。因此,如果您在 2 秒延迟和 30 秒超时的情况下执行此操作,那么每个用户每 30 秒将访问该数据库 15 次。

是的,长轮询可能会占用大量资源。作为开发人员,您必须决定可以分配多少服务器资源来改善用户体验。

websockets 是现在聊天系统的首选解决方案,因为它绕过了这个问题,允许服务器在发生变化时联系客户端,而不是让 n 个客户端每隔 x 秒联系一次服务器询问是否有问题改变了。它通常通过在客户端添加新消息时客户端调用的“发布消息”命令来工作,然后该命令会将新消息广播到所有连接的客户端。

【讨论】:

  • 对于聊天系统,你还会推荐长轮询吗?我想在if no new message 之后 10 秒 sleep() 最多 3 次然后返回。可以吗?
  • 对不起,我刚刚更新了我的答案以更清楚。长轮询的优点是您可以获得近乎实时的结果,而不必每秒发送一个请求。是的,在循环中使用 sleep(),循环 3 次检查新消息将是长轮询的一个示例。
  • 我个人会睡 2 秒,然后循环 15 次,导致 30 秒超时。
  • 这是一个权衡。您必须决定是更倾向于使用实时感觉的聊天系统,还是更倾向于使用较少服务器资源密集型的解决方案,这种解决方案提供的实时感觉要少得多。
  • 经过您的编辑后,我想我会选择 websockets。
猜你喜欢
  • 2016-08-22
  • 2011-05-14
  • 2011-06-05
  • 1970-01-01
  • 1970-01-01
  • 2015-06-23
  • 2010-09-29
  • 1970-01-01
相关资源
最近更新 更多