宁辉522 发表于 2013-1-23 01:16:23

ajax长链接的实现

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

一种的方法是每隔很短的时间发送一个ajax请求,检测运算到哪一步,通过检测ajax返回来处理。
这样的好处是实现起来简单,但对客户端和服务端压力都比较大。

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

js:

Js代码   
1. var step = 1,   
2.   
3. getProgress = function(){   
4.   $.ajax({   
5.         type:"POST",   
6.         url:'getdata.php',   
7.         dataType:'text',   
8.         data:{step:step},   
9.         timeout:10*60*1000,//设置10分钟超时   
10.         success:function(data){   
11.             data = (new Function("return "+data))();   
12.             if(data.step == 1){      
13.               console.log("step 1 complete");   
14.               step++;   
15.               getProgress();   
16.   
17.             } else if(data.step == 2){   
18.               console.log("step 2 complete");   
19.               step++;   
20.               getProgress();   
21.             } else if(data.step == 3){   
22.               console.log("all complete!");   
23.             } else if(data == "error"){ //如果出错,则重试   
24.               getProgress();   
25.             }   
26.         },   
27.         error:function(){   
28.             alert("运算超时");   
29.         }   
30.   });   
31. };

php:

Php代码   
1. if(!emptyempty($_POST['step'])){   
2.   $step = $_POST['step'];   
3.   set_time_limit(0);//这里是关键,设置链接永不过时   
4.   if($step == 1){         //每一步由不同的shell处理,php会等shell执行完毕再继续执行   
5.         $sh = "./test1.sh";   
6.   } else if($step == 2){   
7.         $sh = "./test2.sh";   
8.   } else if($step == 3){   
9.         $sh = "./test3.sh";   
10.   }   
11.   
12.   $ret = exec($sh,$results,$rc);   
13.   if($rc == 0){   
14.         echo "{step:".$step."}";   
15.   } else {   
16.         echo "error";   
17.   }   
18.   
19. }

TAG:Ajax ajax AJAX
页: [1]
查看完整版本: ajax长链接的实现