首页 > 代码库 > php+ajax 长轮询

php+ajax 长轮询

最近在做项目时要做一个即时提醒功能,第一次做没思路。就百度了下。发现好多都说的模糊不清。我整理了下发出来大家指点下

jquery 代码:

这里使用使用ajax请求test页面获取success的值,请求超时时间为20秒。在20秒内若没数据返回则一直保持连接

$(function(){
        $("#btn").bind(‘click‘,{btn:$(‘#btn‘)},function(e){
            $.ajax({
               type: ‘POST‘,
               dataType: ‘json‘,               
               url: ‘test.php‘,
               timeout: ‘20000‘,//请求超时时间
                 data: {time: ‘2000000‘},// 每次请求等待时间
                 success: function(data,status){
                   if(data.success == ‘1‘){
                   $("#msg").append(‘<br>[有数据]‘+data.text);
                   e.data.btn.click();
                }
                   // 未从服务器中获的数据
                     if(data.success == ‘0‘){
                      $("#msg").append(‘<br>[无数据]‘);
                      e.data.btn.click();
                   }
                },
                                // ajax超时,继续查询
                error:function(XMLHttpRequest,textStatus,errorThrown){
                     if(textStatus == "timeout"){
                        $("#msg").append(‘超时‘);
                        e.data.btn.click();
                     }
                }
          });
        });
    });

php代码:

if(empty($_POST[‘time‘])) exit();
  set_time_limit(0);// 无限请求超时时间
  usleep($_POST[‘time‘]);// 等待时间
  while(true){
      $i++;
      $rand = rand(1,999);
      if($rand < 150){
          $arr = array(‘success‘=>‘1‘,‘name‘=>‘有值‘,‘text‘=>$rand);
          echo json_encode($arr);
          exit();
      }else{
      $arr = array(‘success‘=>‘0‘,‘name‘=>‘无值‘,‘text‘=>$rand);
      echo json_encode($arr);
      exit();
    }
}