我尝试阅读一些文章,但目前对这些概念并不十分清晰。
有人能否尝试向我解释以下这些技术是什么:
- 长轮询
- 服务器发送事件
- Websockets
- Comet
每次我看到的一个共同点是,服务器保持连接打开并将数据推送到客户端。如何保持连接打开,客户端如何获取推送的数据?(客户端如何使用数据,也许一些代码可以帮助?)
现在,哪种技术应该用于实时应用程序?我一直听说websockets(使用socket.io [node.js库]),但为什么不能用PHP呢?
我尝试阅读一些文章,但目前对这些概念并不十分清晰。
有人能否尝试向我解释以下这些技术是什么:
每次我看到的一个共同点是,服务器保持连接打开并将数据推送到客户端。如何保持连接打开,客户端如何获取推送的数据?(客户端如何使用数据,也许一些代码可以帮助?)
现在,哪种技术应该用于实时应用程序?我一直听说websockets(使用socket.io [node.js库]),但为什么不能用PHP呢?
下面的示例中,客户端是浏览器,服务器是托管网站的Web服务器。
在您理解这些技术之前,您必须先了解传统HTTP Web流量。
当有新信息可用时,服务器向客户端发送事件。
现在,当新数据可用时,服务器和客户端可以互相发送消息。
Comet是一组在HTML5之前使用流媒体和长轮询技术实现实时应用的技术集合。请参考维基百科或这篇文章了解更多信息.
现在, 为实时应用程序(需要编码)我该选择哪个? 我听说过很多关于websockets的事情(使用socket.io [一个node.js库]),但不能使用PHP吗?
你可以使用PHP与WebSockets,查看Ratchet。
Tieme花了很多心思写了他出色的答案,但我认为OP问题的核心是这些技术如何与PHP相关,而不是每种技术如何工作。
除了明显的客户端HTML、CSS和Javascript之外,PHP是Web开发中使用最广泛的语言。然而,当涉及到实时应用程序时,PHP存在两个主要问题:
libphp5.so
,Windows上的php5ts.dll
等),它仍像CGI一样处理GET / POST请求。它仍像构建“页面”并结束其生命周期一样执行代码。结果,在PHP用户空间内,它对多线程或事件驱动编程的支持非常少,从而使它目前不适用于实时多用户应用程序。请注意,PHP确实有扩展程序为PHP用户空间提供事件循环(例如libevent
)和线程(例如pthreads
),但是非常非常少的应用程序使用它们。
PHP 7将是解决这些问题的重大进步,并且似乎非常有前途成为实时应用程序平台。
轮询是一种定期向服务器请求信息的技术,通常使用HTTP协议建立连接。轮询有两种类型:
在短轮询中,客户端向服务器请求信息,服务器处理请求。如果服务器有客户端请求的数据,则它会返回所需的信息。但是,如果服务器没有可供客户端使用的数据,则服务器将返回一个空响应。在两种情况下,服务器都会在返回响应后关闭连接。即使在服务器发送空响应后,客户端仍会不断发出新的请求。这种机制增加了服务器的网络开销。
在长轮询中,客户端可以请求服务器获取信息,但服务器可能不会立即响应。当服务器收到请求时,如果它没有适用于客户端的最新数据,则服务器保持请求处于打开状态并等待数据到达。当服务器接收到新数据时,它将立即向客户端传送响应并完成打开请求。然后,客户端可以在从服务器获取答案后发送另一个请求以获取新的更新。长轮询通过减少空响应的数量来降低成本。
WebSocket是一种协议,它在单个TCP连接上提供双向通信通道。WebSocket为客户端和服务器之间提供了持久连接,允许双方随时开始传输数据。WebSocket握手是客户端创建WebSocket连接的过程。如果操作成功,则服务器和客户端可以随时发送和接收数据。主要用于实时Web应用程序,如WhatsApp,Uber。
与WebSocket不同,使用SSE无法从客户端向服务器发出请求,因为它是单向连接。当我们需要从服务器到客户端的“准实时”传输,或者如果服务器循环生成数据,则SSE是理想选择。
Comet是一种Web应用程序设计范例,它描述了服务器和Web浏览器之间使用本机HTTP方法进行连续的双向交互。 Comet是一个总称。 Ajax Push、HTTP Streaming和HTTP Server Push是可用于提供此事件驱动交互的一些HTTP机制。