Ajax 长轮询限制


Ajax Long Polling Restrictions

所以我和一位朋友正在构建一个基于Web的AJAX聊天软件,其中包含jQuery和PHP核心。到目前为止,我们一直在使用每两秒左右调用服务器以查找更新的标准过程。但是,我不喜欢这种方法,因为它不快,也不"划算",因为即使没有返回任何数据,也会有大量的请求从服务器来回传递。

我们的一位项目支持者建议我们研究一种称为COMET的技术,或者更具体地说,长轮询。然而,在不同的文章和博客文章中阅读了它之后,我发现当与Apache服务器一起使用时,它并不是那么实用。似乎大多数人只是说"这不是一个好主意",但没有给出太多关于Apache一次可以处理多少请求的细节。

PureChat 的全部目的是为人们提供一个看起来很棒、速度快且适用于大多数服务器的聊天。因此,我假设大约96%的用户将使用Apache,而不是Lighttpd或Nginx,它们被认为更适合长轮询。

切中要害:

在您看来,继续使用 setInterval 并反复请求新数据是否更好?还是使用长轮询更好,尽管大多数用户将使用 Apache ?此外,在Apache服务器翻滚并死亡之前,可以更具体地了解大约有多少人可以使用聊天?

正如Andrew所说,套接字连接是与服务器进行异步通信的最终解决方案,尽管目前只有最先进的浏览器支持WebSockets。 socket.io 是一个开源API,您可以使用它,如果浏览器支持WebSocket连接,它将启动WebSocket连接,但如果浏览器不支持它,它将回退到Flash替代方案。但是,这对于使用 API 的编码人员是透明的。

套接字连接基本上保持浏览器和服务器之间的开放通信,以便每个服务器都可以随时相互发送消息。套接字服务器守护程序将保留已连接订阅者的列表,当它收到来自其中一个订阅者的消息时,它可以立即将此消息发送回所有订阅者。

但是,对于套接字

连接,您需要一个在服务器上全职运行的套接字服务器守护程序。虽然这可以通过命令行PHP(不需要Apache(来完成,但它更适合像node.js这样的东西,一个非阻塞的服务器端JavaScript api。

节点.js对于您所说的长轮询也会更好。基本上node.js是事件驱动的单线程。这意味着您可以保持许多连接处于打开状态,而不必打开尽可能多的线程,这会占用大量内存(Apaches 问题(。这允许高可用性。但是,您必须记住的是,即使您使用的是像Nginx这样的非阻塞文件服务器,PHP也有许多阻塞网络调用。由于它在单个线程上运行,因此每个(例如(MySQL调用基本上会停止服务器,直到返回对该MySQL调用的响应。发生这种情况时,不会执行任何其他操作,从而使您的非阻塞服务器无用。但是,如果您使用非阻塞语言(如JavaScript(node.js(进行网络调用,这将不是问题。它不会等待来自MySQL的响应,而是设置一个处理程序函数来在响应可用时处理响应,从而允许服务器在等待时处理其他请求。

对于长轮询,您基本上会发送一个请求,服务器将等待 50 秒才能响应。如果有任何要报告的内容,它将在 50 秒内响应,否则它会等待。如果 50 秒后没有任何要报告的内容,它仍然会发送响应,以便浏览器不会超时。响应将触发浏览器发送另一个请求,并且该过程将重新开始。这允许更少的请求和更快速的响应,但同样,不如套接字连接好。