我曾尝试阅读一些文章,但我对这些概念还不是很清楚 .
有人愿意尝试向我解释这些技术是什么:
长轮询
服务器发送的事件
Websockets
彗星
我每次遇到的一件事是,服务器保持连接打开并将数据推送到客户端 . 如何保持连接打开,客户端如何获取推送数据? (客户端如何使用数据,也许某些代码可能有帮助?)
现在,我应该将其中哪一个用于实时应用 . 我听过很多关于websockets的事情(有socket.io [一个node.js库]),但为什么不用PHP呢?
在下面的示例中,客户端是浏览器,服务器是托管网站的Web服务器 .
在了解这些技术之前,您必须首先了解经典的HTTP Web流量 .
客户端从服务器请求网页 .
服务器计算响应
服务器将响应发送给客户端 .
客户端使用常规HTTP从服务器请求网页(请参阅上面的HTTP) .
客户端接收所请求的网页并在页面上执行JavaScript,该JavaScript以规则的间隔(例如0.5秒)从服务器请求文件 .
服务器计算每个响应并将其发回,就像普通的HTTP流量一样 .
客户端接收请求的网页并在页面上执行JavaScript,该页面从服务器请求文件 .
服务器不会立即响应所请求的信息,而是等待有可用的 new 信息 .
当有新信息可用时,服务器会使用新信息进行响应 .
客户端收到新信息并立即向服务器发送另一个请求,重新启动该过程 .
客户端收到请求的网页,并在页面上执行JavaScript,打开与服务器的连接 .
当有新信息可用时,服务器向客户端发送事件 .
从服务器到客户端的实时流量,主要是's what you'll需要的
您将要使用具有事件循环的服务器
无法与其他域的服务器连接
如果你想了解更多,我发现这些非常有用:(article),(article),(article),(tutorial) .
客户端使用常规http从服务器请求网页(请参阅上面的HTTP) .
当新数据(任何一方)可用时,服务器和客户端现在可以相互发送消息 .
从服务器到客户端 and 从客户端到服务器的实时流量
使用WebSockets,可以从另一个域连接服务器 .
也可以使用第三方托管的websocket服务器,例如Pusher或others . 这样你只需要实现客户端,这很容易!
如果你想了解更多,我发现这些非常有用:(article),(article)(tutorial) .
Comet是HTML5之前的一系列技术,它们使用流式传输和长轮询来实现实时应用 . 阅读wikipedia或this文章的更多内容 .
现在,我应该将其中一个用于实时应用程序(我需要编写代码) . 我听过很多关于websockets的事情(有socket.io [一个node.js库]),但为什么不用PHP呢?
您可以将PHP与WebSockets一起使用,请查看Ratchet .
我试图记下这些并收集并编写了一份来自 java perspective 的例子 .
HTTP for Java Developers
Reverse Ajax - Old style
Async Handling on server side
Reverse Ajax - New style
Server Sent Events
将它放在任何正在研究相同主题的java开发人员这里 .
Tieme在他的优秀答案中投入了大量精力,但我认为OP问题的核心是这些技术与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应用程序的最佳尝试也需要定期重新启动 . 这也使得它对于实时应用程序来说不实用 .
PHP 7将是解决这些问题的重要一步,并且作为实时应用程序的平台似乎非常有前途 .
3 回答
在下面的示例中,客户端是浏览器,服务器是托管网站的Web服务器 .
在了解这些技术之前,您必须首先了解经典的HTTP Web流量 .
常规HTTP:
客户端从服务器请求网页 .
服务器计算响应
服务器将响应发送给客户端 .
Ajax轮询:
客户端使用常规HTTP从服务器请求网页(请参阅上面的HTTP) .
客户端接收所请求的网页并在页面上执行JavaScript,该JavaScript以规则的间隔(例如0.5秒)从服务器请求文件 .
服务器计算每个响应并将其发回,就像普通的HTTP流量一样 .
Ajax Long-Polling:
客户端使用常规HTTP从服务器请求网页(请参阅上面的HTTP) .
客户端接收请求的网页并在页面上执行JavaScript,该页面从服务器请求文件 .
服务器不会立即响应所请求的信息,而是等待有可用的 new 信息 .
当有新信息可用时,服务器会使用新信息进行响应 .
客户端收到新信息并立即向服务器发送另一个请求,重新启动该过程 .
HTML5服务器已发送事件(SSE)/ EventSource:
客户端使用常规HTTP从服务器请求网页(请参阅上面的HTTP) .
客户端收到请求的网页,并在页面上执行JavaScript,打开与服务器的连接 .
当有新信息可用时,服务器向客户端发送事件 .
从服务器到客户端的实时流量,主要是's what you'll需要的
您将要使用具有事件循环的服务器
无法与其他域的服务器连接
如果你想了解更多,我发现这些非常有用:(article),(article),(article),(tutorial) .
HTML5 Websockets:
客户端使用常规http从服务器请求网页(请参阅上面的HTTP) .
客户端收到请求的网页,并在页面上执行JavaScript,打开与服务器的连接 .
当新数据(任何一方)可用时,服务器和客户端现在可以相互发送消息 .
从服务器到客户端 and 从客户端到服务器的实时流量
您将要使用具有事件循环的服务器
使用WebSockets,可以从另一个域连接服务器 .
也可以使用第三方托管的websocket服务器,例如Pusher或others . 这样你只需要实现客户端,这很容易!
如果你想了解更多,我发现这些非常有用:(article),(article)(tutorial) .
Comet:
Comet是HTML5之前的一系列技术,它们使用流式传输和长轮询来实现实时应用 . 阅读wikipedia或this文章的更多内容 .
您可以将PHP与WebSockets一起使用,请查看Ratchet .
我试图记下这些并收集并编写了一份来自 java perspective 的例子 .
HTTP for Java Developers
Reverse Ajax - Old style
Async Handling on server side
Reverse Ajax - New style
Server Sent Events
将它放在任何正在研究相同主题的java开发人员这里 .
Tieme在他的优秀答案中投入了大量精力,但我认为OP问题的核心是这些技术与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应用程序的最佳尝试也需要定期重新启动 . 这也使得它对于实时应用程序来说不实用 .
PHP 7将是解决这些问题的重要一步,并且作为实时应用程序的平台似乎非常有前途 .