- 作(zuò)者:admin
- 發表時(shí)間(jiān):2013-07-02 14:17:10
- 來(lái)源:未知
HTTP是無狀态、單向的協議,用戶隻能夠通(tōng)過客服端向服務器(qì)發送請(qǐng)求并由服務器(qì)處理(lǐ)發回一個(gè)響應。若要實現聊天室、WEBQQ、在線客服、郵箱等這些(xiē)即時(shí)通(tōng)訊的應用,就要用到“ 服務器(qì)推送技(jì)術(shù)(Comet)”。
傳統的AJAX輪詢方式,客服端以用戶定義的時(shí)間(jiān)間(jiān)隔去服務器(qì)上(shàng)查詢最新的數(shù)據。種這種拉取數(shù)據的方式需要很(hěn)短(duǎn)的時(shí)間(jiān)間(jiān)隔才能保證數(shù)據的精确度,但(dàn)太短(duǎn)的時(shí)間(jiān)間(jiān)隔客服端會(huì)對服務器(qì)在短(duǎn)時(shí)間(jiān)內(nèi)發送出多(duō)個(gè)請(qǐng)求。
反轉AJAX,就是所謂的長輪詢或者COMET。服務器(qì)與客服端需要保持一條長時(shí)間(jiān)的請(qǐng)求,它使得(de)服務器(qì)在有(yǒu)數(shù)據時(shí)可(kě)以返回消息給客戶端。
XHTML
jQuery
這裏使用AJAX請(qǐng)求data.php頁面獲得(de)‘success’的值,請(qǐng)求的時(shí)間(jiān)達到80秒(miǎo)。在這80秒(miǎo)中若沒有(yǒu)從服務端返回‘success’則一直保持連接狀态,直到有(yǒu)數(shù)據返回或‘success’的值為(wèi)0才關閉連接。在關閉連接後在繼續下一次的請(qǐng)求。
$(function(){ $("#btn").bind("click",{btn:$("#btn")},function(evdata){ $.ajax({ type:"POST", dataType:"json", url:"data.php", timeout:80000, //ajax請(qǐng)求超時(shí)時(shí)間(jiān)80秒(miǎo) data:{time:"80"}, //40秒(miǎo)後無論結果服務器(qì)都返回數(shù)據 success:function(data,textStatus){ //從服務器(qì)得(de)到數(shù)據,顯示數(shù)據并繼續查詢 if(data.success=="1"){ $("#msg").append(" [有(yǒu)數(shù)據]"+data.text); evdata.data.btn.click(); } //未從服務器(qì)得(de)到數(shù)據,繼續查詢 if(data.success=="0"){ $("#msg").append(" [無數(shù)據]"); evdata.data.btn.click(); } }, //Ajax請(qǐng)求超時(shí),繼續查詢 error:function(XMLHttpRequest,textStatus,errorThrown){ if(textStatus=="timeout"){ $("#msg").append(" [超時(shí)]"); evdata.data.btn.click(); } } }); }); });
PHP
在這裏是無限的循環,循環的結束條件就是獲取到了返回結果返回Json數(shù)據。
并且接受$_POST['time']參數(shù)來(lái)限制(zhì)循環的超時(shí)時(shí)間(jiān),避免資源的過度浪費。(浏覽器(qì)關閉不會(huì)發消息給服務器(qì),使用可(kě)能一直循環下去)
if(empty($_POST['time']))exit(); set_time_limit(0);//無限請(qǐng)求超時(shí)時(shí)間(jiān) $i=0; while (true){ //sleep(1); usleep(500000);//0.5秒(miǎo) $i++; //若得(de)到數(shù)據則馬上(shàng)返回數(shù)據給客服端,并結束本次請(qǐng)求 $rand=rand(1,999); if($rand<=15){ $arr=array('success'=>"1",'name'=>'xiaocai','text'=>$rand); echo json_encode($arr); exit(); } //服務器(qì)($_POST['time']*0.5)秒(miǎo)後告訴客服端無數(shù)據 if($i==$_POST['time']){ $arr=array('success'=>"0",'name'=>'xiaocai','text'=>$rand); echo json_encode($arr); exit(); } }
運行(xíng)效果:在圖中可(kě)以看到無數(shù)據的請(qǐng)求時(shí)間(jiān)達到了40S,在40S的請(qǐng)求中若獲得(de)數(shù)據則請(qǐng)求關閉。