1

我的代码:

@ini_set('zlib.output_compression',0);
@ini_set('implicit_flush',1);
@ob_end_clean();
set_time_limit(0);
function show_status($done, $total, $size=30) {
    static $start_time;

    if($done > $total) return;

    if(empty($start_time)) $start_time=time();
    $now = time();

    $perc=(double)($done/$total);

    $bar=floor($perc*$size);

    $status_bar="[";
    $status_bar.=str_repeat("=", $bar);
    if($bar<$size){
        $status_bar.=">";
        $status_bar.=str_repeat(" ", $size-$bar);
    } else {
        $status_bar.="=";
    }

    $disp=number_format($perc*100, 0);

    $status_bar.="] $disp%  $done/$total";

    @$rate = ($now-$start_time)/$done;
    $left = $total - $done;
    $eta = round($rate * $left, 2);

    $elapsed = $now - $start_time;

    $status_bar.= " remaining: ".number_format($eta)." sec.  elapsed: ".number_format($elapsed)." sec.";

    echo "$status_bar\r";

    flush();

    if($done == $total) {
        echo "\n";
    }
}

调用很简单 show_status($count, $total_count); - 由于某种原因它无法在我的服务器上运行,但我知道上面的代码有效(来自网络,我之前在另一台服务器上使用过它)。我现在在我当前的服务器上遇到的问题是它每次执行都没有输出它,只有在处理完所有内容后才能看到最终结果(100%)。

  • 输出缓冲设置为关闭(即使不需要,因为它是通过 CLI 执行的)
  • zlib.output_compression 设置为 Off
  • 查看前 4 行代码到其他设置,我也尝试显式设置
  • 在 .htaccess 中也有“SetEnv no-gzip dont-vary”,因为这显然是 flush() 不起作用的另一个原因

我错过了什么!?这不是浏览器问题,因为我再次通过 CLI 运行它!PS:我在 WAMP 上使用 php 5.3.6 和 apache 2.2.16 运行它

4

1 回答 1

2

看完剧本后,我相信它没有任何问题。运行此测试后,我看到一行显示完成 8% 的状态:

show_status(10, 1000);
show_status(40, 1000);
show_status(80, 1000);
echo "\n";

但是,如果我运行此脚本:

show_status(10, 1000);
sleep(5);
show_status(40, 1000);
sleep(5);
show_status(80, 1000);
echo "\n";

输出线每 5 秒定期更换一次,状态为 1%、4%、8%

我想你所跟踪的状态是简单的完成比输出渲染要快得多,所以你会看到一个完成的结果。

flush() 对 CLI 没有影响。

于 2013-03-01T09:56:56.593 回答