命令行接口- PHP flush()不能通过CLI脚本工作


command line interface - PHP flush() not working via CLI script

我的代码:

@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行代码的其他设置我也试图显式设置
  • 也有"SetEnv no-gzip don -vary"在。htaccess中,因为这显然是flush()不工作的另一个原因

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

看完脚本后,我相信它没有任何问题。在运行这个测试之后,我看到一行显示了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%

我想无论你跟踪的是什么状态,完成的速度远远快于输出的渲染速度,所以你看到的是一个完成的结果。