循环时运行进度条

时间:2013-01-16 08:16:48

标签: php while-loop progress-bar

我有这个while循环,基本上循环遍历数据库中的大量记录,并将数据插入另一个:

$q = $con1->query($users1) or die(print_r($con2->errorInfo(),1));
while($row = $q->fetch(PDO::FETCH_ASSOC)){
    $q = $con2->prepare($users2);
    $q->execute(array($row['id'], $row['username'])) or die(print_r($con2-errorInfo(),1));
}

(脚本已经缩短以便于阅读 - 正确的脚本有更长的数组)

我想更加图形化,并显示进度条已经走了多远,而不只是看到一个页面加载了几分钟(这个中有~20,000行 - 我有很多表更多数据)

我知道您可以从旧数据库中获取总数,我也可以轻松地将当前数字放入这样的变量中:

$q = $con1->query($users1) or die(print_r($con2->errorInfo(),1));
$i = 0;
while($row = $q->fetch(PDO::FETCH_ASSOC)){
    $q = $con2->prepare($users2);
    $q->execute(array($row['id'], $row['username'])) or die(print_r($con2-errorInfo(),1));
    $i++;
}

但是现在我需要实际获取$i并显示它 - 或类似的东西。

这怎么“轻松”完成?

进度条的代码可以与while循环在同一文档中,也可以在另一个文档中更容易。

2 个答案:

答案 0 :(得分:1)

您可以执行“master”文件,对第一个文件执行ajax以运行单个查询。您可以在此主文件中获取所有条目ID,然后将其作为参数传递给执行单个查询的第二个文件。将这些ID存储在javascript数组中。

创建一个执行此操作的函数,当第一个ajax完成时,移动到id数组的第二个元素,并使用第二个参数执行另一个ajax。这就是magento进口的方式:)

如果您需要进一步解释,请告诉我,我尽力解释,但可能还不太清楚。

// you generate this javascript array using php.
// let's say you have all the ids that have to be processed in $Ids php array.
Ids = [<?php echo implode(',', $Ids); ?>];

function doAjax(i) {
    $.ajax({  // using jquery for simplicity
        'url': "ajax.php?id=" + Ids[i],
    }).done(function(){
        if ( i >= 0 ) {
            // at the point you know you're at ((Ids.length-i)/(Ids.length) * 100) percent of the script
            // so you can do something like this:
            // $('.progressbar').css('width', ((Ids.length-i)/(Ids.length) * 100) + '%');
            doAjax(i-1);
        }
    });
}

doAjax(Ids.length); // starting from the last entry

所以,只是为了解释这是做什么的。它首先声明一个全局javascript数组,其中包含需要更改的所有ID。

然后我声明了一个递归的ajax函数,这样我们可以确保在任何一次只运行一个ajax(所以服务器不会爆炸),我们可以有一个相当准确的进度。这个ajax函数执行以下操作:

  • 向ajax.php发送请求?id = xxx - 其中xxx是javascript数组中的id之一。
  • 在文件中,我们获取id($_GET['id']),从旧数据库中获取它,并将其插入新数据库中。这只适用于一个条目。
  • 当ajax完成时,它转到done()函数。由于我们使用最后一个元素启动doAjax()函数,因此我们执行下一次迭代doAjax(i-1)。由于我们在数组中向后移动,我们检查密钥是否为正。如果不是,脚本将停止。

就是这样。

答案 1 :(得分:0)

你不能。 php首先由服务器解释,然后以HTML-Code的形式发送给用户 唯一的可能是创建一个html页面并用AJAX调用php脚本。