3

因此,我和一个朋友正在构建一个基于 Web 的、带有 jQ​​uery 和 PHP 核心的 AJAX 聊天软件。到目前为止,我们一直在使用标准程序,即每两秒左右调用一次服务器以查找更新。但是我开始不喜欢这种方法,因为它不快,也不是“成本效益”,因为即使没有返回数据,服务器也会来回发送大量请求。

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

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

切入正题:

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

4

1 回答 1

2

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

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

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

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

For long polling, you would basically send a request, the server would wait 50 seconds before responding. It will respond sooner than 50 seconds if it has anything to report, otherwise it waits. If there is nothing to report after 50 seconds, it sends a response anyways so that the browser does not time out. The response would trigger the browser to send another request, and the process starts over again. This allows for fewer requests and snappier responses, but again, not as good as a socket connection.

于 2012-05-08T17:22:57.787 回答