ajax长轮询的实现

 今天一同学请帮忙,要求实现用户上传文件后,交给服务端调用shell处理,处理分好几步,而且处理时间可能长达数分钟,并要将每一部处理反馈给用户,让用户知道当前进行到哪一步。

 

 

一种的方法是每隔很短的时间发送一个ajax请求,检测运算到哪一步,通过检测ajax返回来处理。

这样的好处是实现起来简单,但对客户端和服务端压力都比较大。

 

 

还有一种方法,就是发送一个ajax请求,一直处于等待状态,直到服务端有数据时再返回,这样可以显著降低请求数目,减少服务端压力。

 

 

js:

 

		var step = 1,

		getProgress = function(){
			$.ajax({
				type:"POST",
				url:'getdata.php',
				dataType:'text',
				data:{step:step},
				timeout:10*60*1000,  //设置10分钟超时
				success:function(data){
					data = (new Function("return "+data))();
					if(data.step == 1){		
						console.log("step 1 complete");
						step++;
						getProgress();

					} else if(data.step == 2){
						console.log("step 2 complete");
						step++;
						getProgress();
					} else if(data.step == 3){
						console.log("all complete!");
					} else if(data == "error"){ //如果出错,则重试 
						getProgress();
					}
				},
				error:function(){
					alert("运算超时");	
				}
			});
		};
 

 

php:

 

if(!empty($_POST['step'])){
	$step = $_POST['step'];
	set_time_limit(0);  //这里是关键,设置链接永不过时
	if($step == 1){           //每一步由不同的shell处理,php会等shell执行完毕再继续执行
		$sh = "./test1.sh";
	} else if($step == 2){
		$sh = "./test2.sh";
	} else if($step == 3){
		$sh = "./test3.sh";
	}

	$ret = exec($sh,$results,$rc);
	if($rc == 0){
		echo "{step:".$step."}";
	} else {
		echo "error";
	}

}
 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值