今天一同学请帮忙,要求实现用户上传文件后,交给服务端调用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_pmit(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. }
评分:0
① 凡本网注明稿件来源为"原创"的所有文字、图片和音视频稿件,版权均属本网所有。任何媒体、网站或个人转载、链接转贴或以其他方式复制发表时必须注明"稿件来源:我考网",违者本网将依法追究责任;
② 本网部分稿件来源于网络,任何单位或个人认为我考网发布的内容可能涉嫌侵犯其合法权益,应该及时向我考网书面反馈,并提供身份证明、权属证明及详细侵权情况证明,我考网在收到上述法律文件后,将会尽快移除被控侵权内容。