0

我有一份长期的工作来填写数据库中的表格。这项工作可能需要不同的时间才能完成。所以,我需要一个进度条。只计算页面就足够了。到目前为止,我找到了几种解决方案:

  1. 使用 _SESSION。好的,它适用于我使用的大多数服务器,但我在 chrome 上的 ERR_RESPONSE_HEADERS_TOO_BIG 错误有很多问题,有时 - 某些服务器上的“标头已发送”,由循环中调用的 session_start/session_write_close 引起。我喜欢这种方法,但现在我拒绝了
  2. 在长操作的循环中使用一种 ob_start/ob_end_flush。这行不通。它只是在脚本结束后显示所有缓冲的回显消息。
  3. 使用 db 存储共享变量(尚未尝试)
  4. 使用单独的(临时)文件。(尚未尝试)。

我已经实现了基础架构:一个用于长时间作业的脚本(在 db 中填充表)和另一个由 JS 用于读取包含进度状态的共享变量的脚本。我用 jQuery .ajax 方法调用的这两个脚本都期望在 .done 函数中得到结果。

还有其他方法吗?似乎我想使用 4) 变体,但我想知道实现进度条的通常做法是什么。

谢谢:)

4

3 回答 3

0

好吧,使用会话是要走的路,但是如果用户不小心关闭了浏览器怎么办?然后进度条将重置为其初始状态。此外,您得到的错误是因为您在发送标头之前显html 。

因此,我认为最好的方法是将进度存储在表(数据库)中,每次用户访问页面时,将其从表中拉出并显示已完成工作的百分比。

脚步:

1. Default State In Table: 0 - indicates that user has not filled out anything 
2. User Fills out page 1 update progress in table: 1 - indicates user completed page 1
3. User Fills out page 2 update progress in table: 2 - indicates user completed page 2

要以百分比显示,请执行以下操作:

$total = 3; //total pages that user needs to fill out
$filledOut = $db->getUserProgressStatus(); //return the digit status of user progress
$percent = ($filledOut / $total) * 100; //gives you % value 

所以这就是你在每一页上得到的值:

Page 1: (0 / 3) * 100 = 0%
Page 2: (1 / 3) * 100 = 33% //first page completed
Page 3: (2 / 3) * 100 = 67% //second page completed
Page 4 (summary page): (3 / 3) * 100 = 100% //completed
于 2013-06-19T13:34:15.787 回答
0

首先,如果您还没有,我会将 PHP 代码作为一个单独的进程运行。

 <?php 

 exec('/usr/bin/php /Path/to/script.php  {$param1} {$param2} > /dev/null 2>/dev/null &'); 

 ?>

然后,我将让这个过程根据用户 ID 更新数据库的进度,然后您可以在超时函数中使用 ajax 调用来获取状态(完成多少数据库写入、剩余多少等) D B。

于 2013-06-19T13:37:50.013 回答
0
function fcflush()
{
    static $output_handler = null;
    if ($output_handler === null) {
        $output_handler = @ini_get('output_handler');
    }
    if ($output_handler == 'ob_gzhandler') {
        // forcing a flush with this is very bad
        return;
    }
    flush();
    if (function_exists('ob_flush') AND function_exists('ob_get_length') AND ob_get_length() !== false) {
        @ob_flush();
    } else if (function_exists('ob_end_flush') AND function_exists('ob_start') AND function_exists('ob_get_length') AND ob_get_length() !== FALSE) {
        @ob_end_flush();
        @ob_start();
    }
}

//infinite loop example of usage
$counter = 0;
while (true) {
    echo $counter."<br />";
    fcflush();
    $counter++;
}
于 2013-06-19T13:42:34.527 回答