有人可以保存这两个文件并运行它们并告诉我为什么我收到错误“ob_flush()[ref.outcontrol]:无法刷新缓冲区。没有缓冲区要刷新”。我试着用Google搜索,它说我必须使用ob_start();但是当我这样做时,它不会逐行打印,而是在完成后从FOR循环返回整个对象。我是PHP的新手,所以我不确定在哪里看...
test_process.php
// This script will write numbers from 1 to 100 into file
// And sends continuously info to user
$fp = fopen( '/tmp/output.txt', 'w') or die('Failed to open');
set_time_limit( 120);
ignore_user_abort(true);
for( $i = 0; $i < 100; $i++){
echo "<script type=\"text/javascript\">parent.document.getElementById( 'foo').innerHTML += 'Line $i<br />';</script>";
echo str_repeat( ' ', 2048);
flush();
ob_flush();
sleep(1);
fwrite( $fp, "$i\n");
}
fclose( $fp);
main.html中
<html>
<head>
<script src="http://code.jquery.com/jquery-latest.min.js" type="text/javascript" charset="utf-8"></script>
<style type="text/css" media="screen">
.msg{ background:#aaa;padding:.2em; border-bottom:1px #000 solid}
.new{ background-color:#3B9957;}
.error{ background-color:#992E36;}
</style>
</head>
<body>
<iframe id="loadarea" width="1024px" height="768px"></iframe><br />
<script>
function helper() {
document.getElementById('loadarea').src = 'test_process.php';
}
function kill() {
document.getElementById('loadarea').src = '';
}
</script>
<input type="button" onclick="helper()" value="Start">
<input type="button" onclick="kill()" value="Stop">
<div id="foo"></div>
</body>
</html>
答案 0 :(得分:14)
如果输出缓冲区处于活动状态(例如ob_flush()
或配置设置),则 仅 需要ob_start()
。如果还没有,请删除ob_flush()
。或者你可以使它有条件:
if( ob_get_level() > 0 ) ob_flush();
答案 1 :(得分:10)
我认为您将ob_flush()
与flush()
混为一谈。虽然ob_start()
和ob_flush()
处理捕获所有输出的PHP内部输出缓冲区,但flush()
是与其他编程语言一样刷新STDOUT
的正常函数。
示例:
<?php
ob_start();
echo "Foobar\nFoobar\nFoobar\n";
// Nothing printed yet
ob_flush(); // Now it is printed.
echo "Foobar\n"; // Printed directly, because contains a line ending.
echo "Foobar"; // Not printed, because normally buffers are flushed on line endings
flush(); // Printed.
修改强>
您的输出未打印,因为您的网络服务器可能会缓冲内容。尝试关闭压缩和输出缓冲:
@apache_setenv('no-gzip', 1);
@ini_set('zlib.output_compression', 0);
@ini_set('implicit_flush', 1);
请记住,Safari和Internet Explorer有一个内部1K缓冲区。因此,您需要添加1 KB的填充数据(如空格),以使其呈现。
编辑2: 您的实施已被破坏。您想使用ajax轮询您的数据。在客户端使用jQuery:
<div id="counter">0%</div>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js">
<script type="text/javascript">
function doPoll(){
$.post('script-that-returns-stuff.php', function(data) {
$("#counter").html(data);
setTimeout(doPoll,5000);
});
}
doPoll();
</script>
然后在script-that-returns-stuff.php
:
<?php
$file = explode("\n", file_get_contents("/tmp/output.txt"));
$last_line = $file[count($file)-1];
echo $last_line."%";
答案 2 :(得分:1)
ob_start()在哪里?
ob_flush将输出缓冲区刷新到文件句柄。也许你错了。
一个例子:
ob_start(); //start output buffering
echo 'hello world'; //not outputed
ob_flush(); //sends the output buffer so displays hello world.