如何运行长PHP脚本并继续通过HTTP向浏览器发送更新?
与输出缓冲有关,但我不确切知道如何。
答案 0 :(得分:3)
输出缓冲正在考虑正确的方向,您可以在发送任何输出之前,使用ob_start()
开始输出缓冲,就像在脚本顶部某处使用会话(session_start
)一样。 / p>
然后,您可以使用ob_flush
和flush
来保持刷新输出。例如,如果您处于foreach
循环中,并且在每个循环结束时您想要输出新行并等待1秒,那么您可以这样做。
但也要看set_time_limit
,否则人们可能会在30秒左右后遇到超时。
另一个快速说明,某些浏览器在实际开始显示之前需要最少的输出字节数。我不确定它是多少字节,我认为它大约是4000.此外,有些浏览器在关闭之前不会呈现某些元素(如表格)。因此,冲洗也不会起作用。
答案 1 :(得分:2)
这看起来像你所追求的:
输出缓冲,PHP一旦准备就将脚本的输出发送到您的Web服务器 - 这可能是代码块逐行或代码块。
ob_start()函数用于 创建一个新的输出缓冲区,和你 可以立即开始写它 正常打印内容。一旦 你有一个缓冲打开,有两个 关闭它的方法:ob_end_flush()和 ob_end_clean(),两者都结束了 缓冲区,但稍微这样做 不同的方法。前者结束了 缓冲并将所有数据发送到输出, 而后者没有结束缓冲区 有效地将其发送到输出 消除您保存的任何信息 在那里。每一段文字 在输出缓冲器输出时输出 open被放入缓冲区中 反对被送到产出。 请考虑以下脚本:
<?php
ob_start();
print "In first buffer!\n";
ob_end_flush();
ob_start();
print "In second buffer!\n";
ob_end_clean();
ob_start();
print "In third buffer!\n";
?>
该脚本将输出“首先 缓冲区“因为第一个文本是 放入缓冲液然后冲洗 ob_end_flush()函数。 “在第二个缓冲区” 但是,不会打印出来,因为 它被放入一个缓冲区 使用ob_end_clean()清理而不是 发送到输出。最后,脚本 将打印出“在第三缓冲区” 因为PHP会自动刷新打开 到达结尾时输出缓冲区 一个剧本。
答案 2 :(得分:1)
您还可以拥有一种后台任务,以及一个为您提供进度的界面。
例如,一个名为job.php的页面
<?php
for ($i=0; $i<100; ++$i)
{
store($i);
// long stuff
sleep(42);
}
?>
和progress.php
<?php
return get($i);
?>
然后一些ajax调用progress.php?task = mytaskid并更新GUI。我已经看到了这种“大”文件上传的方法,发现它很棒。
编辑:对不起,这并没有完全回答最初的问题。
答案 3 :(得分:1)
<?php
# try this...
for (;;) {
echo time() . '<br>';
ob_flush(); # http://php.net/ob_flush
flush(); # http://php.net/flush
sleep(1); # http://php.net/sleep
}
?>
答案 4 :(得分:1)
我通过简单的HTTP输出得到了页面更新,以使其正常工作:
<body>
中的所有未处理元素 - 否则将无法显示<p>
)这是我的代码:
for ($nc=0; $nc<10; $nc++){
// delay just to test
sleep(1);
// send message to browser
ob_end_clean();
ob_start();
echo "<p>Update ".$nc."</p>";
ob_end_flush();
flush();
}