正如 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.