程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> 基於jQuery與PHP實現Ajax長輪詢(LongPoll)

基於jQuery與PHP實現Ajax長輪詢(LongPoll)

編輯:關於PHP編程

傳統的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. $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.         echo json_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.         echo json_encode($arr);      
  21.         exit();      
  22.     }      
  23. }   

運行效果:在圖中可以看到無數據的請求時間達到了40S,在40S的請求中若獲得數據則請求關閉。


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved