是否可以在冲洗内输出缓冲?

时间:2013-05-06 05:34:59

标签: php apache buffer flush

我正在尝试将功能状态显示为其循环,但在下一个状态显示之前删除之前的状态。目前的代码:

<?php
@ini_set('zlib.output_compression',0);
@ini_set('implicit_flush',1);
@ob_end_clean();
set_time_limit(0);

// Perform 1st function here
echo "Retrieving Data...";
echo str_repeat(' ',1024*64);
sleep(1);


// Perform 2nd function here
echo "Analyzing Data...";
echo str_repeat(' ',1024*64);
sleep(1);


// Perform 3rd function here
echo "Done...";
echo str_repeat(' ',1024*64);
sleep(1);
// Clean all echos here..
?>
<html>
<head>
 // Dynamic head content as a result of the php functions above
</head>
<body>
</body>
</head>

现在这个有效,但是一个接一个地显示所有的回声。我希望下一个状态替换第一个,直到结束,然后在显示html之前删除“完成”。

我试过了:

ob_start();
echo "Retrieving Data...";
echo str_repeat(' ',1024*64);
sleep(1);
ob_end_clean();    

但那没用。这有可能吗?

2 个答案:

答案 0 :(得分:1)

以下使用最后一个类型的伪CSS选择器来隐藏所有旧的进度状态消息。它是一个相当新的选择器,因此它在旧版浏览器上运行良好(IE9之前),您可以检查Mozilla Developer Network上的兼容性

<html>
<head>
    <style type="text/css">
        #progress span {
            display: none;
        }
        #progress span:last-of-type {
            display: block; !important
        } 
    </style>
</head>
<body>
<div id="progress">
<?php
for ($i =0; $i<=100; $i+=10) {
    ob_start();
    echo "<span>$i%</span>";
    ob_end_clean();  
    sleep(1);
}
?>
</div>
</body>
</html>

答案 1 :(得分:0)

用\ r输出你的线条。这会将光标返回到同一行的0。在哪里可以写下来。

echo "Retrieving Data..\r";
sleep(3);
echo "Analyzing Data...\r";
sleep(3);
echo "Done...          \r\n";

我在最后一个echo中添加了一个\ n,否则命令提示符会覆盖最后一个echo。