PHP:ServerPush (Comet推送) 技能的讨论ITeye - AG环亚娱乐集团

PHP:ServerPush (Comet推送) 技能的讨论ITeye

2019-01-11 17:38:15 | 作者: 辰龙 | 标签: 推送,技能,完结 | 浏览: 1382

PHP中Push(推送)技能的讨论  [http://vistaswx.com/blog/article/php-server-push]

 

跟着人们对Web即时运用需求的不断上升,Server Push(推送)技能在谈天、音讯提示尤其是交际网络等方面开端鼓起,成为实时运用的数据流中心。这篇日志企图讨论的便是各种适合于PHP的Push的完结办法以及其好坏。

 

1. 什么是Server Push

幻想在谈天运用中,假如运用传统的ajax来承当音讯的传入,那么一般是经过每隔必定时刻拉取一次信息的办法完结,可是其实这种办法有许多查询是糟蹋的。谈天等Web运用更需求服务器在特定时刻来自动奉告前端有新的音讯(Push),而不是前端每时每刻问服务器:“来音讯了吗?”(Pull)。这也正是为什么这个技能常被叫做反向ajax。

其他别号:Comet,反向Ajax

 

2. 怎么完结Push

其实所谓的推送技能也没有多么杂乱,现在从大类上有3种,一种依然建立在ajax基础上,还有一种建立在结构基础上,最终一种扔掉了传统的HTTP协议,运用Flash或许HTML5的WebSockets技能。接下来将对这三种类别发生的不同的办法进行讨论。

 

1) Ajax 长轮询

Ajax长轮询从本质上来说依然是一种pull,可是实时性较高,无用恳求削减许多,是一种不错的Push完结计划。不过它只削减了网络上的无谓耗费。

 

中心: 客户端建议一个ajax恳求,服务端将恳求放置(pending)或许说挂起,直到到了超时时刻(timeout)或需求推送时回来;客户端则等候ajax回来后处理数据,再建议下一个ajax恳求。

 

长处: 兼容性较高,完结简略

 

缺陷: 关于php这种言语来说,假如要做到实时,那么服务端就要承受大得多的压力,由于放置到什么时分往往是不确定的,这就要php脚本每次放置都进行一个while循环。


当然,假如服务器改写每秒级,那尚可承受,仅仅实时性上退化了。

 

留意: 浏 览器有衔接数约束。我得出的结论是假如当时页面上有一个ajax恳求处于等候回来状况,那么其他ajax恳求都会被放置(Chrome, Firefox已测)。假如页面有一般ajax需求怎么办?处理办法是开个结构,结构中使在另一个域名下进行Comet长轮询,需求留意跨域问题。

 

PHP完结: Jquery+php完结comet

相关:Ajax跨域和js跨域处理计划

 

2) Frame 长衔接

遭到ajax启示,呈现了结构下的长衔接。

 

中心: Frame中建议一个一般恳求,服务器将其放置;需求推送时输出直接履行
脚本,然后持续坚持衔接。假如忧虑超时问题能够改成结构论询。

 

长处: 与1相同具有高兼容特性

 

缺陷: 最大的问题是假如结构在载入,那么浏览器就好一向显现“载入中”,这就弱爆了(处理办法拜见文末的相关阅览资源)。相同服务器也要能hold住许多循环……别的,是否有同域衔接约束没测验。

 

3) Flash/HTML5 WebSockets

用flash来建议WebSockets,秒杀前面一切问题。

 

长处: 标准化, RealTime, Push

 

缺陷: 服务器需求能应对WebSockets;还有假如既没有Flash又不支撑HTML5的怎么办?

 

PHP完结: Start Using HTML5 WebSockets Today

 

6) 运用兼容封装层(socket.io)

以上每种办法都有好坏,那么终极处理计划便是合在一起!能WebSockets时分就WebSockets,不支撑HTML5特性就退化到Flash,没有Flash则退化到Ajax长轮询。这也是我的Rainbowfish所选用的办法。

 

长处: 高度封装,编写十分简单,简直不需求关怀怎么去完结的。实时,超低负载,高并发。

 

缺陷: 其实算不上缺陷,socket.io的服务器端要求是node.js,而不是php。

 

个人观点: 假如你是独立主机,能运转程序,那么socket.io合作node.js是个十分高效的挑选。为什么呢?由于它还能够防止php的服务端高负载。

 

Rainbowfish 的音讯体系经过这种办法完结: 一切客户端都经过socket.io挂在nodejs服务器上(留意: 仅仅挂着,不需求任何循环,由于它是事情驱动的);需求推送音讯了,服务器就与nodejs通讯(比方拜访某个地址来完结),通知它推送什么音讯到哪 里;nodejs收到推送信号后,则经过socket.io实时传输数据给浏览器。这个其实也是一条单向的路,由于nodejs服务器不具备与php通讯 的才能,实际上也不需求,网页上直连续php就能够了。

 

3. 结束语

事 实上,第一个办法(Ajax Long Pull)是一个不错的办法,仅仅假如运用php完结的话服务器负载上有点大,但这其实是通病;而最终罗列的socket.io计划彻底防止了这个问题, 由于它归于另一种架构,而且这种组合也能够合作简直一切的脚本言语完结push。

 

关于实时性要求十分高的运用,或许运用php完结实时部分并不是一个好的挑选,将会面对十分大的服务器负载(能够经过编写支撑等候事情的扩展来处理这个问题);假如仅仅音讯提示等,则能够调整服务器上改写的距离降低到秒的等级,负载尚可承受。不过不管哪种用处,合作那些非堵塞言语或许才是最好的挑选。

 

4. 相关阅览

How to implement COMET with PHP

Start Using HTML5 WebSockets Today

Comet(Wikipedia)

Ajax跨域和js跨域处理计划

Jquery+php完结comet

 

==============================================================================================

 

comet研讨[http://lync.in/research-on-comet/]

在 Web运用中,客户端的AJAX技能现已十分遍及也十分家喻户晓了,但与此同时,另一些运用,比如在线监控,实时数据显现,即时通讯等需求将后台数据改变 状况实时显现到前台,这样的由服务器push的行为(或许会让你想到blackberry)则需求另一种计划来处理,也便是本文所要介绍的Comet —— 无需装置插件,坚持http长衔接的服务器推计划。


以下两点是计划中有必要顾及到的。

浏览器通用性,对各种不同完结结构模型的支撑。 长衔接关于服务器资源的占用,以及服务器的承受才能。
版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表AG环亚娱乐集团立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章