2013-09-23 39 views
-1

我有一个简单的安装程序,分为多个段,不是语法,而是逻辑。以下是它的工作方式:安装进度条php

if ($_POST['install'] == "Install") 
{ 
// fetches user values 

// creates tables 

// creates some files 

// creates some emails 

// inserts relevant stuff into the database 

// finishes 
} 

该代码太长而且对此问题没有必要。这些步骤中的每一步都完成了20%的安装,我将如何使进度条向用户显示信息?我希望这样做的原因有两个,一个是让他们跟踪,另一个是让他们知道在完成之前不应该关闭浏览器选项卡。

现在我的想法是为代码的每个部分分配一个变量,例如第一个中的$done = 20%,第二个中的$done = 40%等等,并且简单地显示基于该变量的进度条。我唯一不知道的是如何显示进度条?

感谢

+2

该过程实际需要多长时间?这一切都是在一个请求中完成还是“向导”式安装? (看起来像它一次安装) –

+0

它创建10个表,插入一些数据,挂钩到cPanel中创建一些电子邮件,更改一些文件名并创建1个文件。根据托管机器的负载,我会说1-2分钟左右。这一切都是一步完成的,你填写一个表格并按下install =) –

回答

2

我推荐的解决方案:

创建你的进程,像这样的每个步骤单独Ajax请求......

// do first step 
$.ajax({ 
    url: myUrl + '?step=1', 
    success: function() { 
    // update progress bar 20% 
    } 
}); 

// do second step 
$.ajax({ 
    url: myUrl + '?step=2', 
    success: function() { 
    // update progress bar 40% 
    } 
}); 

// etc. 

如果你想干燥,试试这个:

var steps = 5; 

for (var i = 1; i <= steps; i++) { 
    $.ajax({ 
     url: myUrl + '?step=' + i; 
     success: function() { 
     // update success incrementally 
     } 
    }); 
} 

用jQuery UI进度条:

$(function() { 

    $("#progressbar").progressbar({ 
     value: 0 
    }); 

    var steps = 5; 

    for (var i = 1; i <= steps; i++) { 
     $.ajax({ 
      url: myUrl + '?step=' + i; 
      success: function() { 
      // update success incrementally 
      $("#progressbar").progressbar('value', i * 20); 
      } 
     }); 
    } 

}); 

Ref。 http://jqueryui.com/progressbar/#default

+1

这种方法的另一个好处是每个部分都是独立的。如果失败了,你还没有失去一切。您可以重新开始停止。 –

+0

听起来很容易。如果我说我从字面上知道0 ajax,你会如何建议我在这里显示基于你的代码的进度条?谢谢! –

+0

您拥有代码的方式会导致所有的ajax函数立即启动,实质上是在同一时间执行每个步骤,当它们应该在步骤中完成时,一个接一个地完成。 –

1

最佳做法是将进度值存储在数据库或键值存储系统(如APC,Memcache或Redis)中。然后用ajax查询检索进度。

一个很好的jQuery插件是从jQuery的UI progressbar栏,您可以使用JSON来编码进度值:

// GET /ajax/get-status.json 
{ 
    "progress":10, 
    "error":"", 
    "warning":"" 
} 

页:

<div id="error" style="color: red"></div> 
<div id="warning" style="color: yellow"></div> 
<div id="message"></div> 
<div id="progressbar"></div> 
<script type="text/javascript"> 
     jQuery(document).ready(function() { 
      $("#progressbar").progressbar({ value: 0 }); 
      $.ajaxSetup({ cache: false }); 

      function updateProgress() { 
       jQuery.getJSON("/ajax/get-status.json", function(response) { 

        if (response.error) { 
         $("#error").html(response.error); 
         return; 
        } else { 
         $("#progressbar").progressbar('value', parseInt(response.progress)); // Add the new value to the progress bar 
         $("#message").html(response.message); 
         $("#warning").html(response.warning); 
         if(parseInt(response.progress) < 100){ 
          setTimeout(updateProgress, 1); 
         } 
        } 
        }); 
      } 

      updateProgress(); 
     });   
</script> 
+0

我正在研究APC,但从我的理解中,用户将不得不手动安装它,并且试图尽可能地简化它。我将研究这里提供的所有解决方案并实施一个,谢谢=) –

+0

如果您不想使用db或任何键值系统,您可以在会话中始终使用它,则APC安装在服务器端 –

+0

上。 – skler

1

您可以使用HTML5进度酒吧。

发送ajax请求并返回完成百分比。 更改进度标签的值。

<progress id='p' max="100" value="50"></progress> 
+0

虽然这是一个答案,但它是一个非常无用的。 –

+0

如何?他不确定如何显示进度条。 – Vlad

+0

我猜这个答案在第五次编辑后效果更好 –