1. 程式人生 > >ajax+php超時操作,延時返回資料

ajax+php超時操作,延時返回資料

在一次微信掃碼登入中,為了減少ajax的請求次數研究了一下,ajax中的timeout的應用,

js程式碼如下:

var dataarr = {
    type: "POST",
    url: "__MODULE__/System/CheckUserWx", 
    timeout:65000, //ajax請求超時時間65秒      
    data:{uid:'<{$uid}>',rand:'<{$rand}>'},//60秒後無論結果伺服器都返回資料
    success:function(res) {
		if(res.bool){
			$('#info').html('<i class="Hui-iconfont c-success f-20"></i> 繫結成功!');
			var t= setTimeout('layer_close()',1000);
		}else{
			$.ajax(dataarr);
		}
    },
    // Ajax請求超時,繼續查詢      
    error: function(XMLHttpRequest, textStatus, errorThrown) {
        if (textStatus == "timeout") {
            $.ajax(dataarr);// Ajax請求超時,繼續查詢  
        }
    }
};
$.ajax(dataarr);

PHP端的程式碼:
//檢測微信繫結情況
public function CheckUserWx(){
	$res['bool'] = false;
	if(IS_POST){
		$rand = I('post.rand');
		$uid = I('post.uid');
		$i = 0;
		while(true){
	        usleep(500000);//暫停5s
	        $i++;
	        //獲取資料
			$rand = M('WechatRand')->where(array('rand'=>$rand))->find();
			if($rand['openid']){
				$arr['uid'] = $uid;
				$arr['openid'] = $rand['openid'];
				$b = M('users')->save($arr);
				if($b !== false){//有值就返回資料
					M('WechatRand')->delete($rand['id']);
					$res['bool'] = true;
					$user = M('users')->find($uid);
					$this->action('繫結微信!');
					$wx = new \Wechat\Controller\SendMsgController();
	                $wx->BD_user_wx($rand['openid'],$user['username']);
	                $this-> ajaxReturn($res,'JSON');
	                break;
				}
			}
			if($i > 20){//檢測超過20次返回錯誤
				$res['bool'] = false;
	            $this->ajaxReturn($res,"JSON");
	            break;
	        }
		}
	}
}

服務端每5s檢測一次資料,如果有資料就返回。