所以我和朋友正在构建一个基于Web的AJAX聊天软件,它带有jQuery和PHP核心。到目前为止,我们一直在使用标准程序每两秒左右调用服务器以查找更新。然而,我不喜欢这种方法,因为它不快,也不是“成本效益”,因为有大量的请求来自服务器,即使没有返回数据。
我们的一个项目支持者建议我们研究一种称为COMET的技术,或者更具体地说,长轮询。然而,在阅读了不同文章和博客文章后,我发现与Apache服务器一起使用时并不是那么实用。似乎大多数人只是说“这不是一个好主意”,但是对于Apache一次处理多少请求的方式,不要给出太多细节。
PureChat的全部目的是为人们提供一个看起来很棒,速度很快,并且适用于大多数服务器的聊天。因此,我假设大约96%的用户将使用Apache,而不是Lighttpd或Nginx,它们更适合长轮询。
了解要点:
在您看来,继续使用setInterval并重复请求新数据是否更好?或者使用Long Polling是否更好,尽管大多数用户将使用Apache?此外,有可能在Apache服务器翻转和死亡之前大约有多少人可以使用聊天来获得更具体的概述?
答案 0 :(得分:2)
正如安德鲁所说,套接字连接是与服务器进行异步通信的最终解决方案,尽管目前只有最先进的浏览器支持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))进行网络调用,则不会出现问题。它不是等待MySQL的响应,而是设置一个处理函数来处理响应,只要它可用,允许服务器在等待时处理其他请求。对于长轮询,您基本上会发送请求,服务器会在响应前等待50秒。如果有任何报告,它将在50秒后响应,否则等待。如果在50秒后没有任何内容需要报告,则无论如何都会发送响应,以便浏览器不会超时。响应将触发浏览器发送另一个请求,然后该过程重新开始。这样可以减少请求和快速响应,但同样不如套接字连接。