如何运行一个长PHP脚本并通过HTTP不断向浏览器发送更新?
如何运行一个长PHP脚本并通过HTTP不断向浏览器发送更新如何运行一个长PHP脚本并通过HTTP不断向浏览器发送更新?,php,scripting,timing,updates,Php,Scripting,Timing,Updates,如何运行一个长PHP脚本并通过HTTP不断向浏览器发送更新 与输出缓冲有关,但我不知道具体是如何实现的。这看起来像是您想要的: 输出缓冲,PHP在您的web服务器准备好后立即将脚本的输出发送到web服务器-这可能是逐行或逐代码块 ob_start()函数用于 创建一个新的输出缓冲区,然后 可以立即开始向它写入 正常打印内容。一旦 你打开了一个缓冲区,有两个 关闭它的方法:ob_end_flush()和 ob_end_clean(),两者都是 缓冲区,但要稍微按 不同的方式。前者结束了战争 缓冲
与输出缓冲有关,但我不知道具体是如何实现的。这看起来像是您想要的: 输出缓冲,PHP在您的web服务器准备好后立即将脚本的输出发送到web服务器-这可能是逐行或逐代码块 ob_start()函数用于 创建一个新的输出缓冲区,然后 可以立即开始向它写入 正常打印内容。一旦 你打开了一个缓冲区,有两个 关闭它的方法:ob_end_flush()和 ob_end_clean(),两者都是 缓冲区,但要稍微按 不同的方式。前者结束了战争 缓冲区,并将所有数据发送到输出, 后者结束缓冲区而不使用 有效地将其发送到输出 清除您保存的所有信息 在那里。每一段文字 当输出缓冲区被激活时输出 open作为 反对被发送到输出。 考虑下面的脚本:
该脚本将首先输出“In”
缓冲区”,因为第一个文本是
放入缓冲区,然后用
ob_end_flush()。“在第二个缓冲区中”
不会被打印出来,因为
它被放在一个缓冲区中
使用ob_end_clean()清洁,而不是
发送到输出。最后是剧本
将打印“在第三个缓冲区中”
因为PHP会自动刷新打开
输出缓冲区到达末尾时
一个剧本
输出缓冲考虑的方向是正确的,在发送任何输出之前,使用
ob\u start()
开始输出缓冲,就像在脚本顶部的某个位置使用会话(session\u start
)一样
然后,您可以使用ob_flush
和flush
继续刷新输出。例如,如果您处于foreach
循环中,并且在每个循环结束时,您希望输出新行并等待1秒,那么您可以这样做
但也要注意设置时间限制,否则人们可能会在30秒左右的时间后超时
另一个简要说明是,一些浏览器在实际开始显示输出之前需要最小字节数。我不确定它是多少字节,我想大约是4000字节。此外,某些浏览器在关闭某些元素(如表)之前不会呈现它们。因此,刷新在那里也不起作用。您还可以有一种后台任务,以及一个提供进度的界面 例如,一个名为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。我见过这样一个“大”文件上传的方法,发现它很棒
编辑:抱歉,这并没有完全回答最初的问题。
<?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
}
?>
我使用简单的HTTP输出进行页面更新,以使其正常工作:
- 确保关闭
中所有打开的元素,否则它将不会显示 - 将输出的文本包含在元素中(例如
) - 使用输出缓冲和正常冲洗
- 在Firefox3上测试
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();
}
for($nc=0;$nc)浏览器是否会在不等待整个HTML页面下载的情况下显示刷新的输出?因为当我这样做时,浏览器会等待整个页面完成…“某些浏览器需要最少的字节数”--包括Firefox?你是说这种通过HTTP发送更新的技术并不能像在服务器上完成的那样真正更新用户?我不确定哪些浏览器的行为与我想象的一样,我可以告诉你,根据我的经验和观点,这种技术不是最好的/最有效的/可靠的。如果你是abl要使用Javascript,我个人肯定会选择这个解决方案。我已经在Firefox上测试了一些代码,它在不需要4K字节的情况下进行了更新,但您必须确保结束任何打开的元素(在
中),否则它不会显示,您必须将输出的文本包含在一个元素中(例如
)PHP不是为长期运行而设计的。你们为什么需要它?是的,你们需要它的目的是什么?制作一些流媒体服务还是什么?若你们想用信息更新浏览器,那个么使用“AJAX”。
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();
}