关于php:什么是长轮询,Websockets,服务器发送事件(SSE)和Comet?

What are Long-Polling, Websockets, Server-Sent Events (SSE) and Comet?

我试过读一些文章,但我对概念还不是很清楚。

是否有人愿意尝试向我解释这些技术是什么:

  • 长时间轮询
  • 服务器发送的事件
  • 网络套接字
  • 彗星
  • 每次我遇到的一件事是,服务器保持连接打开并将数据推送到客户机。如何保持连接打开,以及客户机如何获取推送的数据?(客户机如何使用数据,也许一些代码会有所帮助?)

    现在,我应该使用其中的哪一个作为实时应用程序。我听说过很多关于websockets(使用socket.io[一个node.js库])的事情,但是为什么不使用php呢?


    在the examples below the is the浏览器客户端和服务器托管服务器is the the website。P></

    之前,你可以明白你要了解这些技术,经典的HTTP Web交通第一。P></正则http:

  • 在从客户端请求到服务器webpage。
  • 服务器响应calculates the the
  • the the response to the末服务器客户端。
  • HTTPP></Ajax的配置:

  • 在客户端计算机请求到HTTP服务器使用的正则webpage from a(see http above)。
  • 客户receives the requested webpage JavaScript和executes on the which the page from the requests文件服务器(例如,在正则intervals 0.5秒)。
  • 服务器响应calculates each和茶末回来,只是正常的HTTP交通类。
  • Ajax PollingP></AJAX跨配置:

  • 在客户端计算机请求到HTTP服务器使用的正则webpage from a(see http above)。
  • 客户receives the requested webpage和executes on the which the requests JavaScript网页文件从服务器。
  • the server does not but with the requested立即反应信息等待直到有新的信息可用。
  • 当有新的信息可用,responds with the New the服务器信息。
  • 新的信息和客户receives立即末另一个request to the服务器启动过程,茶王。
  • Ajax Long-PollingP></HTML5的服务器/ eventsource"事件(ESS):

  • 在客户端计算机请求到HTTP服务器使用的正则webpage from a(see http above)。
  • 客户receives the requested webpage JavaScript和executes the page on the which a connection to the opens服务器。
  • 茶末安事件的客户端服务器有when to the New信息可用。P></

    • 实时交通从服务器到客户端,这就是你需要的是什么
    • 你想使用服务器that has an event环
    • connections with are only possible from other域服务器上正确的CORS settings with
    • 如果你想读更多,这些发现非常有用:(条),(第)(第)(教程)。
  • HTML5 SSEP></websockets:HTML5

  • 在客户端计算机请求到HTTP服务器使用的正则webpage from a(see http above)。
  • 客户receives the requested webpage JavaScript和executes the page on the connection with the which opens到服务器。
  • 服务器和客户端(the messages when each other现在发送新数据(在线或者侧)is available。P></

    • 实时交通from the to the客户端服务器和客户端服务器from the to the
    • 你想使用服务器that has an event环
    • websockets en is possible to connect with another从服务器与域。
    • is also possible to使用EN三党websocket for example推服务器代码,或其他。这样你只要实施"订单的客户端,which is Very easy!
    • 如果你想读更多,这些发现非常有用:(条),(第)(教程)。
  • HTML5 WebSocketsP></彗星:

    彗星is a collection of prior to which使用HTML5技术是跨流和实时应用的配置。this article或在线阅读维基百科黑莓。P></

    Now, which one of them should I use for a realtime app (that I need to
    code). I have been hearing a lot about websockets (with socket.io [a
    node.js library]) but why not PHP ?

    你可以使用PHP与websockets棘轮,退房。P></


    Tieme在他出色的回答中投入了大量的精力,但我认为ops问题的核心是这些技术如何与PHP相关,而不是每种技术如何工作。

    除了明显的客户端HTML、CSS和JavaScript之外,PHP是Web开发中最常用的语言。然而,当涉及实时应用程序时,PHP有两个主要问题:

    1)PHP从一个非常基本的CGI开始。PHP从早期就已经取得了很大的进步,但它是以很小的步骤发生的。到目前为止,PHP已经拥有数以百万计的用户,成为了可嵌入和灵活的C库,其中大多数人都依赖于它早期的执行模型,因此它还没有真正尝试从内部逃脱CGI模型。即使是命令行接口也会调用PHP库(Linux上的libphp5.so、Windows上的php5ts.dll等),就好像它仍然是一个处理get/post请求的CGI。它仍然执行代码,就好像它只需要构建一个"页面",然后结束它的生命周期。因此,它几乎不支持多线程或事件驱动的编程(在php用户空间内),这使得它目前对于实时、多用户应用程序来说不实用。

    注意,php在php用户空间中有提供事件循环(如libevent)和线程(如pthreads)的扩展,但是很少有应用程序使用这些扩展。

    2)PHP在垃圾收集方面仍然存在重大问题。尽管这些问题一直在改善(很可能这是结束上述生命周期的最大步骤),但即使是创建长时间运行的PHP应用程序的最佳尝试也需要定期重新启动。这也使得实时应用变得不实用。

    PHP7也将是解决这些问题的一个很好的步骤,并且作为实时应用程序的平台似乎非常有希望。


    我试着注意这些,并从Java的角度收集和编写例子。

    Java开发人员的HTTP

    反转Ajax-旧样式

    服务器端异步处理

    反转Ajax-新样式

    服务器发送的事件

    把它放到任何一个正在研究同一主题的Java开发人员那里。


    您可以在Web应用程序中轻松地使用node.js进行实时通信。当涉及WebSockets时,node.js非常强大。因此,"通过node.js发送PHP通知"是一个很好的概念。

    请参见此示例:使用php和node.js创建实时聊天应用程序