基于jQuery与PHP实现Ajax长轮询(LongPoll)

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

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

XHTML

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

jQuery

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

  1. $(function(){   
  2.     $("#btn").bind("click",{btn:$("#btn")},function(evdata){      
  3.          $.ajax({      
  4.                 type:"POST",      
  5.                 dataType:"json",      
  6.                 url:"data.php",      
  7.                 timeout:80000,     //ajax请求超时时间80秒      
  8.                 data:{time:"80"}, //40秒后无论结果服务器都返回数据      
  9.                 success:function(data,textStatus){      
  10.                     //从服务器得到数据,显示数据并继续查询      
  11.                     if(data.success=="1"){      
  12.                      $("#msg").append("<br>[有数据]"+data.text);      
  13.                      evdata.data.btn.click();      
  14.                     }      
  15.                  //未从服务器得到数据,继续查询      
  16.                     if(data.success=="0"){      
  17.                     $("#msg").append("<br>[无数据]");      
  18.                     evdata.data.btn.click();      
  19.                     }      
  20.                 },      
  21.              //Ajax请求超时,继续查询      
  22.              error:function(XMLHttpRequest,textStatus,errorThrown){      
  23.                      if(textStatus=="timeout"){      
  24.                          $("#msg").append("<br>[超时]");      
  25.                          evdata.data.btn.click();      
  26.                      }      
  27.              }      
  28.                       
  29.             });      
  30.     });      
  31.           
  32. });    

PHP

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

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

  1. if(emptyempty($_POST['time']))exit();      
  2. set_time_limit(0);//无限请求超时时间      
  3. 发布于 分类 网站技术

发表评论

电子邮件地址不会被公开。 必填项已用*标注