jquery与php结合实现AJAX长轮询(LongPoll)

HTTP是无状态、单向的协议,用户只能够通过客服端向服务器发送请求并由服务器处理发回一个响应。若要实现聊天室、WEBQQ、在线客服、邮箱等这些即时通讯的应用,就要用到“ 服务器推送技术(Comet)”。

传统的AJAX轮询方式,客服端以用户定义的时间间隔去服务器上查询最新的数据。种这种拉取数据的方式需要很短的时间间隔才能保证数据的精确度,但太短的时间间隔客服端会对服务器在短时间内发送出多个请求。

反转AJAX,就是所谓的长轮询或者COMET。服务器与客服端需要保持一条长时间的请求,它使得服务器在有数据时可以返回消息给客户端。

XHTML

<div id="msg"></div> <input id="btn" type="button" value="测试" />

jQuery

这里使用AJAX请求data.php页面获得‘success'的值,请求的时间达到80秒。在这80秒中若没有从服务端返回‘success'则一直保持连接状态,直到有数据返回或‘success'的值为0才关闭连接。在关闭连接后在继续下一次的请求。

$(function(){ $("#btn").bind("click",{btn:$("#btn")},function(evdata){ $.ajax({ type:"POST", dataType:"json", url:"data.php", timeout:80000, //ajax请求超时时间80秒 data:{time:"80"}, //40秒后无论结果服务器都返回数据 success:function(data,textStatus){ //从服务器得到数据,显示数据并继续查询 if(data.success=="1"){ $("#msg").append("<br>[有数据]"+data.text); evdata.data.btn.click(); } //未从服务器得到数据,继续查询 if(data.success=="0"){ $("#msg").append("<br>[无数据]"); evdata.data.btn.click(); } }, //Ajax请求超时,继续查询 error:function(XMLHttpRequest,textStatus,errorThrown){ if(textStatus=="timeout"){ $("#msg").append("<br>[超时]"); evdata.data.btn.click(); } } }); }); });

PHP

在这里是无限的循环,循环的结束条件就是获取到了返回结果返回Json数据。

并且接受$_POST['time']参数来限制循环的超时时间,避免资源的过度浪费。(浏览器关闭不会发消息给服务器,使用可能一直循环下去)

if(emptyempty($_POST['time']))exit(); set_time_limit(0);//无限请求超时时间 $i=0; while (true){ //sleep(1); usleep(500000);//0.5秒 $i++; //若得到数据则马上返回数据给客服端,并结束本次请求 $rand=rand(1,999); if($rand<=15){ $arr=array('success'=>"1",'name'=>'xiaocai','text'=>$rand); echo json_encode($arr); exit(); } //服务器($_POST['time']*0.5)秒后告诉客服端无数据 if($i==$_POST['time']){ $arr=array('success'=>"0",'name'=>'xiaocai','text'=>$rand); echo json_encode($arr); exit(); } }

运行效果:在图中可以看到无数据的请求时间达到了40S,在40S的请求中若获得数据则请求关闭。

时间: 2024-10-25 06:27:23

jquery与php结合实现AJAX长轮询(LongPoll)的相关文章

jquery与php结合实现AJAX长轮询(LongPoll)_AJAX相关

HTTP是无状态.单向的协议,用户只能够通过客服端向服务器发送请求并由服务器处理发回一个响应.若要实现聊天室.WEBQQ.在线客服.邮箱等这些即时通讯的应用,就要用到" 服务器推送技术(Comet)". 传统的AJAX轮询方式,客服端以用户定义的时间间隔去服务器上查询最新的数据.种这种拉取数据的方式需要很短的时间间隔才能保证数据的精确度,但太短的时间间隔客服端会对服务器在短时间内发送出多个请求. 反转AJAX,就是所谓的长轮询或者COMET.服务器与客服端需要保持一条长时间的请求,它使

javascript和jQuery实现网页实时聊天的ajax长轮询_javascript技巧

介绍 大家都知道,HTTP协议是一个属于应用层的面向对象的协议,HTTP 协议一共有五大特点: 1.支持客户/服务器模式; 2.简单快速; 3.灵活; 4.无连接; 5.无状态. 所以一次的请求都是一个单独的事件,和前后都没有联系.所以我们在解决网页实时聊天时就遇到一个问题,如何保证与服务器的长时间联系,从而源源不段地获取信息. 一直以来的方式无非有这么几种: 1.长连接,即服务器端不断开联系,PHP服务器端用ob系列函数来不停的读取输出,但是相当耗费服务器资源. 2.Flash socket,

js-关于ajax长轮询………

问题描述 关于ajax长轮询--- ajax长轮询如何终止?不关闭或则页面的情况,因为我的页面是ajax生成的.还是没办法终止? 解决方案 既然是轮询,那就是定时器控制的,直接禁用定时器就可以了. 解决方案二: 用另外一个ajax告知服务器停止停止线程,至于你线程如何知道这个状态,可以用application等进行数据共享 解决方案三: AJAX 长轮询Ajax轮询

comet 多路复用-怎么结合comet长轮询和lighttpd的IO多路复用来提高并发

问题描述 怎么结合comet长轮询和lighttpd的IO多路复用来提高并发 RT:想解决ajax长轮询带来的阻塞其他请求情况,网上有看到可以结合"多路复用"来解决,从而不影响其他连接请求,可是我不知道这个应该怎么实现,服务器是lighttpd,它的多路复用就更加没有头绪了,请懂的大拿帮个忙?

反向Ajax:Comet用于服务器与客户端之间响应通信的流和长轮询

客户端的示例使用的是 jQuery http://www.aliyun.com/zixun/aggregation/33906.html">JavaScript 库.在这首篇文章中,我们探索不同的反向 Ajax 技术,使用可下载的例子来学习使用了流 (streaming) 方法和长轮询 (long polling) 方法的 Comet. Web 开发在过去的几年中有了很大的进展,我们已经远超了把静态网页链接在一起的做法,这种做法会引起浏览器的刷新,并且要等待页面的加载.现在需要的是能够通过

《Web异步与实时交互——iframe AJAX WebSocket开发实战》—— 1.3 Web实时交互方式——轮询、长轮询、长连接及推送

1.3 Web实时交互方式--轮询.长轮询.长连接及推送 如何实时获取服务器端的最新数据,是Web实时交互关注的内容.在介绍Web实时交互方式前,先来具体了解HTTP的通信机制,为之后概念的精准定义做铺垫.HTTP通信过程可分为4步. 第1步:HTTP是基于传输层的TCP协议,在HTTP工作开始之前,Web浏览器首先要通过网络与Web服务器在TCP层建立连接.在TCP层进行"三次握手"之后,建立了TCP连接,此时HTTP就可以进行传输了(注意,由于HTTP为无连接.无状态的协议,在本书

Web 通信 之 长连接、长轮询(long polling)

基于HTTP的长连接,是一种通过长轮询方式实现"服务器推"的技术,它弥补了HTTP简单的请求应答模式的不足,极大地增强了程序的实时性和交互性. 一.什么是长连接.长轮询? 用通俗易懂的话来说,就是客户端不停的向服务器发送请求以获取最新的数据信息.这里的"不停"其实是有停止的,只是我们人眼无法分辨是否停止,它只是一种快速的停下然后又立即开始连接而已. 二.长连接.长轮询的应用场景 长连接.长轮询一般应用与WebIM.ChatRoom和一些需要及时交互的网站应用中.其真

后台-comet4j长轮询在360兼容模式下不支持,应该怎么办

问题描述 comet4j长轮询在360兼容模式下不支持,应该怎么办 comet4j长轮询在360兼容模式下不支持,应该怎么办,登录平台,直接关闭浏览器,后台代码不运行 解决方案 360兼容模式是ie核心,说明你的这个插件不支持ie8-.自己判断下是否ie8-,用计时器来轮训服务器获取信息罗~ 解决方案二: 兼容模式,浏览器版本比较低,很多JS等功能不支持

利用openresty来优化php-fpm的长轮询

对于长轮询场景是比较常见的,客户端同步的不断的在同步请求,而服务端根据请求来决定是否响应或者hold请求以继续检查数据. 由于php-fpm是单进程单线程的,一个进程同时只能处理一个请求,所以对于这种长轮询的场景,需要启动特别多的php-fpm进程来应对高的并发,这是特别浪费资源的,因为大部分请求都是hold在服务器上. 现在我们用openresty来轮询php-fpm,php-fpm会很快的处理完成,不会hold住,减少了php-fpm的压力,配置文件如下: location ~ /longp