基于jquery,php实现AJAX长轮询(LongPoll)

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

HTTP是无状态、单向的协议,用户只能够通过客服端向服务器发送请求并由服务器处理发回一个响应。若要实现聊天室、WEBQQ、在线客服、邮箱等这些即时通讯的应用,就要用到“服务器推送技术(Comet)”。传统的AJAX轮询方式,客服端以用户定义的时间间隔去服务器上查询最新的数据。种这种拉取数据的方式需要很短的时间间隔才能保证数据的精确度,但太短的时间间隔客服端会对服务器在短时间内发送出多个请求。反转AJAX,就是所谓的长轮询或者COMET。服务器与客服端需要保持一条长时间的请求,它使得服务器在有数据时可以返回消息给客户端。html:viewplaincopytoclipboardprint?1.divid=msg/div2.inputid=btntype=buttonvalue=测试/javascript:这里使用AJAX请求data.php页面获得‘success’的值,请求的时间达到80秒。在这80秒中若没有从服务端返回‘success’则一直保持连接状态,直到有数据返回或‘success’的值为0才关闭连接。在关闭连接后在继续下一次的请求。viewplaincopytoclipboardprint?1.$(function(){2.3.4.$(#btn).bind(click,{btn:$(#btn)},function(evdata){5.$.ajax({6.type:POST,7.dataType:json,8.url:data.php,9.timeout:80000,//ajax请求超时时间80秒10.data:{time:80},//40秒后无论结果服务器都返回数据11.success:function(data,textStatus){12.//从服务器得到数据,显示数据并继续查询13.if(data.success==1){14.$(#msg).append(br[有数据]+data.text);15.evdata.data.btn.click();16.}17.//未从服务器得到数据,继续查询18.if(data.success==0){19.$(#msg).append(br[无数据]);20.evdata.data.btn.click();21.}22.},23.//Ajax请求超时,继续查询24.error:function(XMLHttpRequest,textStatus,errorThrown){25.if(textStatus==timeout){26.$(#msg).append(br[超时]);27.evdata.data.btn.click();28.}29.}30.31.});32.});33.34.});PHP:在这里是无限的循环,循环的结束条件就是获取到了返回结果返回Json数据。并且接受$_POST['time']参数来限制循环的超时时间,避免资源的过度浪费。(浏览器关闭不会发消息给服务器,使用可能一直循环下去)viewplaincopytoclipboardprint?1.if(empty($_POST['time']))exit();2.set_time_limit(0);//无限请求超时时间3.$i=0;4.while(true){5.//sleep(1);6.usleep(500000);//0.5秒7.$i++;8.9.//若得到数据则马上返回数据给客服端,并结束本次请求10.$rand=rand(1,999);11.if($rand=15){12.$arr=array('success'=1,'name'='xiaocai','text'=$rand);13.echojson_encode($arr);14.exit();15.}16.17.//服务器($_POST['time']*0.5)秒后告诉客服端无数据18.if($i==$_POST['time']){19.$arr=array('success'=0,'name'='xiaocai','text'=$rand);20.echojson_encode($arr);21.exit();22.}23.24.}运行效果:在图中可以看到无数据的请求时间达到了40S,在40S的请求中若获得数据则请求关闭。传统的AJAX轮询方式:HTTP请求和响应头信息开销总共包括871字节,而且还不包括任何数据,当然,这只是一个例子,你的消息头数据完全可能低于871字节,但我也看到过消息头数据超过2000字节的情况。在这个例子中,股票主题消息数据大约只有20个字符。当你把这样的程序大规模部署给用户时会怎么样?我们使用三个不同的用例观察一下该轮询应用程序关联的HTTP请求和响应头数据需要的网络吞吐量。用例A:1000客户端,每秒轮询一次网络吞吐量(871x1000)=871000字节=6968000比特/秒(6.6Mbps)用例B:10000客户端,每秒轮询一次网络吞吐量(871x10000)=8710000字节=69680000比特/秒(66Mbps)用例C:100000客户端,每秒轮询一次网络吞吐量(871x100000)=87100000字节=696800000比特/秒(665Mbps)

1 / 5
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功