如何在发生时从php获得实时输出?而无需将所有内容存储在内存/缓冲区中,并一次性回显到浏览器?
如果我创建了一个realtime-echo.php .php
<?php
for($i = 0; $i < 10; $i++)
{
echo $i;
sleep(1);
}并从Internet浏览器访问它,它在9-10秒后给出以下输出。
0123456789但我希望输出的是,当我从我的浏览器访问php文件时,它应该提供
然后等待1秒,然后在"0“之后添加"1”,然后等待1秒,然后在"1“之后添加"2”,依此类推。
idk它所说的像动画/实时。
如何实现这一点?
我正在工作的项目中,我需要不断的输出,因为它发生了,所以我可以密切关注发生了什么和它的发展方向。
谢谢
发布于 2013-09-30 09:24:59
当您想要显示当前输出时,使用flush()函数。
一个简单的例子:
<?php
for ($i = 1; $i <= 10; $i++)
{
echo '<p>' . $i . '</p>';
flush();
sleep(1);
}
?>如果使用输出缓冲,则还需要调用ob_flush()
注意:某些版本的Microsoft Internet Explorer只有在接收到256字节的输出后才会开始显示页面,因此您可能需要在刷新之前发送额外的空格,以使这些浏览器显示页面。
如下所示:
<?php
echo str_repeat(" ", 256);
flush();
?>工作示例(不带ob_start()函数):
<?php
echo str_repeat(" ", 256);
for ($i = 1; $i <= 10; $i++)
{
sleep(1);
echo '<p>' . $i . '</p>';
flush();
}
?>发布于 2013-09-30 20:33:26
PHP是一种解释型服务器语言。使用PHP,您可以创建一些本地程序或实现web应用程序的服务器端。如果您在命令行中运行PHP代码,那么您的代码应该可以按预期工作。但是,如果您通过浏览器使用PHP,那么HTTP就有一个适用的请求-响应策略。如果向浏览器发送请求,则只会在执行脚本时收到服务器的响应。因此,您通过浏览器请求页面,然后等待响应。服务器接收到请求并回送出十个数字,其间有第二个休眠。在服务器完成其任务后,它会将响应发送回您的浏览器,浏览器将在单个批处理中获取这十个数字。这就是为什么您要等待10秒钟,然后所有输出都会同时显示:这是因为服务器执行休眠并收集您的回声,然后将它们发送回您的浏览器,而您的浏览器只是在显示它。
当然,如果您希望在浏览器中显示10个服务器响应,那么您必须做得更好。也许您可以使用polling (例如,使用setInterval或Javascript的setTimeout函数,您可以在客户端中等待秒级,然后使用$.ajax将post请求发送到服务器。在服务器端,您可以处理请求并使用正确的输出进行响应。您的客户端应该有一个回调,您可以在其中处理服务器的响应并相应地显示它)。
发布于 2018-10-25 17:39:43
可以打开输出缓冲,这会阻止实时输出。因此,您需要一个结合了flush()和ob_flush()的echo。
来源:http://php.net/manual/en/function.ob-flush.php#109314
header( 'Content-type: text/html; charset=utf-8' );
echo 'Begin ...<br />';
for( $i = 0 ; $i < 10 ; $i++ ){
echo $i . '<br />';
flush();
ob_flush();
sleep(1);
}
echo 'End ...<br />';我试图创建一个小提琴,但在小提琴中不允许使用sleep()。所以我创建了一个GIF。

https://stackoverflow.com/questions/19085188
复制相似问题