我试过读一些文章,但我对概念还不是很清楚。
是否有人愿意尝试向我解释这些技术是什么:
长时间轮询
服务器发送的事件
网络套接字
彗星
每次我遇到的一件事是,服务器保持连接打开并将数据推送到客户机。如何保持连接打开,以及客户机如何获取推送的数据?(客户机如何使用数据,也许一些代码会有所帮助?)
现在,我应该使用其中的哪一个作为实时应用程序。我听说过很多关于websockets(使用socket.io[一个node.js库])的事情,但是为什么不使用php呢?
- 实时WebSocket还是WebRTC?在PHP中有一个websocket库,您需要编写额外的代码才能使用zmq或仅仅是socket编程,nodejs就是为此构建的,因此它很容易获得。WebSocket在PHP中不可用的原因是,您必须运行一个额外的终端,并使其保持运行,以便WebSocket服务器随时可用,您将拥有两个服务器。而结构,php并不像javascript那样是一个事件结构,所以websocket使用事件结构来捕获和发送消息。
- 另外:comet和serverssent事件是PHP的解决方案,它可以在不创建2个服务器的情况下实现几乎实时(不是真正的)。
在the examples below the is the浏览器客户端和服务器托管服务器is the the website。P></
之前,你可以明白你要了解这些技术,经典的HTTP Web交通第一。P></正则http:
在从客户端请求到服务器webpage。
服务器响应calculates the the
the the response to the末服务器客户端。
P></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交通类。
P></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服务器启动过程,茶王。
P></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
- 如果你想读更多,这些发现非常有用:(条),(第)(第)(教程)。
P></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!
- 如果你想读更多,这些发现非常有用:(条),(第)(教程)。
P></彗星:
彗星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></
- 这太棒了!我在读关于SSE的文章,发现这篇文章非常好-就像我现在比较过的东西,你也可以在这里包括SSE,这样我们也可以交叉检查它与WebSocket的区别吗?
- @天啊,是吗?我认为SSE意味着服务器发送事件。不管怎样,谢谢,我现在看到了。
- 问:在php中,假设您使用的是websocket,那么每个连接到我的服务器的客户机是否都会使用ws:将一个线程分配给他/她,其大小将为~2MB,与正常请求一样?这在nodejs上有什么不同?nodejs可以处理多少个并发客户机,当它中断时会发生什么?
- @泰梅,上交所和拉长有什么区别?从你的话来看,它们几乎是一样的。
- 两种解决方案都可以实现相同的目标,但机制不同。长轮询使用"常规"HTTP数据,SSE使用不同的基础协议,与长轮询相比需要不同的服务器设置。
- 为什么不使用Apache?
- 如果你想的话,你可以用Apache。但是很多人使用node.js是因为它有一个事件循环。但是对于Apache,请参见stackoverflow.com/questions/12203443/…
- 你能告诉我哪种Comet协议将用于SpringMVC吗?
- Gerat回答。但是为什么我要将WebSockets用于具有事件循环的服务器?
- 如果这个答案对底层技术更为明确,那就更好了。使用了哪些TCP连接?在第一个连接上建立的第二个连接是否用于发出原始请求?如何涉及HTTP管道?
- 我同意,你有这个知识吗,或者你认识一个这样做的用户?
- 为了增加@tieme已经回答的问题,SSE和WS的限制可以处理如下:通过使用适当的客户端库(例如Awesome WebSocket)可以解决WS-Reconnect问题。SSE跨源服务器问题可以通过在响应中发送CORS头来解决。
- 我无法理解Comet和Ajax长轮询的区别。在这两种技术中,我们(作为客户机)发送一个Ajax请求,并使用一个开放的HTTP请求等待服务器的响应。@ Tieme
- @埃雷,你读过最后一段并按照网址找到了关于彗星的更多信息吗?
- 我想长轮询(也可能是Comet)将受到网络基础设施的限制,而网络基础设施在HTTP上强制执行短超时。
- @在您解释Ajax轮询时,您的解释让我迷路了,您说"客户机使用常规HTTP从服务器请求网页(参见上面的HTTP),然后请求的网页执行javascript…"常规Web服务器(如Apache)"如何执行javascript"?
- 我认为应该是:"客户端在页面上执行javascript",所以这是浏览器,而不是服务器。清楚吗?
- 你成功了…令人敬畏的回答
- 应该更新这个答案,如果服务器允许,您可以连接到另一个服务器(使用CORS)
- 谢谢@davidbarrat,这在我写原始答案时是不可能的。更新。
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也将是解决这些问题的一个很好的步骤,并且作为实时应用程序的平台似乎非常有希望。
- 一个小小的修正:php总是用C语言写的,如这里所见:museum.php.net/php1同样,"使用较少(但非常流行)"是自相矛盾的,也许你的意思是"更时尚"?
- @imsop-感谢您的更正,我已经使用PHP十多年了,并且一直觉得它的根是在Perl中。PHP历史页面显然也支持它原来是C语言。有空我会修改我的答案。
- 请编辑关于PHP根的答案。
- 我将删除关于Perl的一些内容,因为它与官方文档不太匹配,但这在PHP的早期开发中仍然是一个令人困惑的领域。
- php 7作为实时应用程序的平台似乎很有前途?实时应用程序的php7有哪些改进/变化?
- @我将返回-固定内存管理/垃圾收集、JIT编译等。
- @json twitter.com/rasmus/status/226405807305138176
- 尽管如此,svn.php.net/viewvc/phpdoc/en/trunk/appendments/…&;web.archive.org/web/20090426061624/http://us3.php.net/…
我试着注意这些,并从Java的角度收集和编写例子。
Java开发人员的HTTP
反转Ajax-旧样式
服务器端异步处理
反转Ajax-新样式
服务器发送的事件
把它放到任何一个正在研究同一主题的Java开发人员那里。
您可以在Web应用程序中轻松地使用node.js进行实时通信。当涉及WebSockets时,node.js非常强大。因此,"通过node.js发送PHP通知"是一个很好的概念。
请参见此示例:使用php和node.js创建实时聊天应用程序