Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 安装进度条_Php_Jquery - Fatal编程技术网

Php 安装进度条

Php 安装进度条,php,jquery,Php,Jquery,我有一个简单的安装程序,它不是按语法划分的,而是按逻辑划分的。下面是它的工作原理: if ($_POST['install'] == "Install") { // fetches user values // creates tables // creates some files // creates some emails // inserts relevant stuff into the database // finishes } 对于这个问题,代码太长,没有必要。这

我有一个简单的安装程序,它不是按语法划分的,而是按逻辑划分的。下面是它的工作原理:

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%,等等,然后简单地显示基于该变量的进度条。我唯一不知道的是如何显示进度条


谢谢

我推荐的解决方案:

为流程中的每个步骤创建单独的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 progressbar:

$(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);
           }
        });
    }

});

参考

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

一个好的jquery插件来自jquery ui,您可以使用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>

您可以使用HTML5进度条

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

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

这个过程实际需要多长时间?是在一个请求中完成的还是向导式的安装?看起来它一次安装了所有的文件,创建了10个表,插入了一些数据,挂接到cpanel中创建了一些电子邮件,更改了一些文件名,创建了一个文件。我认为top大约需要1-2分钟,这取决于主机的负载。这一切都在一个步骤中完成,您填写一个表单,然后按install=此方法的另一个优点是每个部分都是独立的。如果一个失败了,你还没有失去一切。你可以在它停止的地方重新启动。听起来很简单。如果我说我真正了解ajax,您会建议我如何根据您的代码在这里显示进度条?非常感谢。您编写代码的方式会导致所有ajax函数一次启动,基本上是在同一时间执行每个步骤,当它们应该在步骤中完成时,一个接一个地完成。@SamFisher I使用jQuery UI progressbar实现更新了答案。@PatrickEvans True,因此最好使用for循环方法。如果并发性仍然是一个问题,那么您可以尝试在$.ajax方法中将async设置为false。虽然这是一个答案,但它是一个非常无用的答案。这是怎么回事?他不知道如何显示进度条。它很好,也很简单,我可以在整个php中重复那个html,并在屏幕上显示它。测试atm=我正在研究APC,但据我所知,用户将不得不手动安装它,我正试图使其尽可能简单。我将研究这里提供的所有解决方案,并实现一个,thank you=APC安装在服务器端如果您不想使用db或任何键值系统,您可以随时使用会话。