php中push(推送)技术的探讨

php中push(推送)技术的探讨

ID:5772846

大小:22.50 KB

页数:2页

时间:2017-12-24

php中push(推送)技术的探讨_第1页
php中push(推送)技术的探讨_第2页
资源描述:

《php中push(推送)技术的探讨》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、PHP中Push(推送)技术的探讨2011年11月24日发表评论(3)查看评论标签:Ajax,Comet,php,Push,RealTime分类:Tech,Web随着人们对Web即时应用需求的不断上升,ServerPush(推送)技术在聊天、消息提醒尤其是社交网络等方面开始兴起,成为实时应用的数据流核心。这篇日志试图探讨的便是各种适合于PHP的Push的实现方式以及其优劣。1.什么是ServerPush想象在聊天应用中,如果使用传统的ajax来承担消息的传入,那么一般是通过每隔一定时间拉取一次信息的方式实现,但是其实这种方式有大量查询是浪费的。聊

2、天等Web应用更需要服务器在特定时间来主动告知前端有新的消息(Push),而不是前端每时每刻问服务器:“来消息了吗?”(Pull)。这也正是为什么这个技术常被叫做反向ajax。其他别名:Comet,反向Ajax2.如何实现Push其实所谓的推送技术也没有多么复杂,目前从大类上有3种,一种仍然建立在ajax基础上,还有一种建立在框架基础上,最后一种抛弃了传统的HTTP协议,使用Flash或者HTML5的WebSockets技术。接下来将对这三种类别产生的不同的方式进行探讨。1)Ajax长轮询Ajax长轮询从本质上来说仍然是一种pull,但是实时性较

3、高,无用请求减少很多,是一种不错的Push实现方案。不过它只减少了网络上的无谓消耗。核心:客户端发起一个ajax请求,服务端将请求搁置(pending)或者说挂起,直到到了超时时间(timeout)或需要推送时返回;客户端则等待ajax返回后处理数据,再发起下一个ajax请求。优点:兼容性较高,实现简单缺点:对于php这种语言来说,如果要做到实时,那么服务端就要承受大得多的压力,因为搁置到什么时候往往是不确定的,这就要php脚本每次搁置都进行一个while循环。当然,如果服务器刷新每秒级,那尚可接受,只是实时性上退化了。注意:浏览器有连接数限制。

4、我得出的结论是如果当前页面上有一个ajax请求处于等待返回状态,那么其他ajax请求都会被搁置(Chrome,Firefox已测)。如果页面有一般ajax需求怎么办?解决方法是开个框架,框架中使在另一个域名下进行Comet长轮询,需要注意跨域问题。PHP实现:Jquery+php实现comet相关:Ajax跨域和js跨域解决方案2)Frame长连接受到ajax启发,出现了框架下的长连接。核心:Frame中发起一个普通请求,服务器将其搁置;需要推送时输出直接执行脚本,然后继续保持连接。如果担心超时问题可以改成框架论询。优点:与1一样具有高兼容特性缺

5、点:最大的问题是如果框架在载入,那么浏览器就好一直显示“载入中”,这就弱爆了(解决方法参见文末的相关阅读资源)。同样服务器也要能hold住大量循环……另外,是否有同域连接限制没测试。3)Flash/HTML5WebSockets用flash来发起WebSockets,秒杀前面一切问题。优点:标准化,RealTime,Push缺点:服务器需要能应对WebSockets;还有如果既没有Flash又不支持HTML5的怎么办?PHP实现:StartUsingHTML5WebSocketsToday6)使用兼容封装层(socket.io)以上每种方法都有优

6、劣,那么终极解决方案便是合在一起!能WebSockets时候就WebSockets,不支持HTML5特性就退化到Flash,没有Flash则退化到Ajax长轮询。这也是我的Rainbowfish所采用的方式。优点:高度封装,编写非常容易,几乎不需要关心如何去实现的。实时,超低负载,高并发。缺点:其实算不上缺点,socket.io的服务器端要求是node.js,而不是php。个人看法:如果你是独立主机,能运行程序,那么socket.io配合node.js是个非常高效的选择。为什么呢?因为它还可以避免php的服务端高负载。Rainbowfish的消息

7、系统通过这种方式实现:所有客户端都通过socket.io挂在nodejs服务器上(注意:只是挂着,不需要任何循环,因为它是事件驱动的);需要推送消息了,服务器就与nodejs通信(比如访问某个地址来实现),告诉它推送什么消息到哪里;nodejs收到推送信号后,则通过socket.io实时传输数据给浏览器。这个其实也是一条单向的路,因为nodejs服务器不具备与php通信的能力,实际上也不需要,网页上直接连php就可以了。3.结束语事实上,第一个方法(AjaxLongPull)是一个不错的方法,只是如果使用php完成的话服务器负载上有点大,但这其实

8、是通病;而最后列举的socket.io方案完全避免了这个问题,因为它属于另一种架构,并且这种组合也可以配合几乎所有的脚本语言实现push

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。