RELATEED CONSULTING
相關咨詢
選擇下列産品馬上(shàng)在線溝通(tōng)
服務時(shí)間(jiān):9:00-18:00
你(nǐ)可(kě)能遇到了下面的問題
關閉右側工具欄
基于jquery,php實現AJAX長輪詢(LongPoll)
  • 作(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)求關閉。