?今天一同学请帮忙,要求实现用户上传文件后,交给服务端调用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"; } }?
?
?