如何从PHP获得实时输出?

时间:2013-09-30 01:23:15

标签: php echo real-time

如何从php获取实时输出?没有全部存储在内存/缓冲区中并一次性回显浏览器?

如果我创建一个realtime-echo.php

<?php
for($i = 0; $i < 10; $i++)
{
echo $i;
sleep(1);
}

并从互联网浏览器访问它,它在9-10秒后提供以下输出。

0123456789

但是我愿意输出的是,当我从浏览器访问php文件时应该给出

0

然后等待1秒然后在“0”后加“1” 然后等待1秒然后在“1”后加“2” 等等。

idk它所谓的动画/实时。

如何实现这一目标?

我正在研究我需要恒定输出的项目,所以我可以留意发生的事情及其发生的地方。

由于

3 个答案:

答案 0 :(得分:7)

如果希望显示当前输出,请使用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();
}
?>

答案 1 :(得分:4)

PHP是一种解释型服务器语言。使用PHP,您可以创建一些本地程序或实现Web应用程序的服务器端。如果您在命令行中运行PHP代码,那么您的代码应该按预期工作。但是,如果您通过浏览器使用PHP,则可以在HTTP上应用请求 - 响应策略。如果您向浏览器发送请求,则只有在执行脚本时才会收到服务器的响应。因此,您通过浏览器请求页面,然后等待响应。服务器接收请求并回送10个号码,并在它们之间进行第二次休眠。 服务器完成其工作后,它会将响应发送回您的浏览器,该响应将在一个批次中获得十个数字。这就是为什么你会遇到等待十秒然后立即显示所有输出的原因:这是因为服务器执行了睡眠并收集了你的回声,然后将它们发送回刚刚显示它的浏览器。

当然,如果您想在浏览器中显示十个服务器响应,那么您必须做得更好。也许您可以使用polling(使用Javascript的setIntervalsetTimeout函数等待客户端中的秒并在之后发送帖子请求例如,使用$.ajax到服务器。在服务器上,您处理请求并使用正确的输出进行响应。您的客户端应该有一个回调,您可以在其中处理服务器的响应并相应地显示它。

答案 2 :(得分:2)

可能会打开输出缓冲,这会阻止实时输出。 因此,您需要将echoflush()ob_flush()结合使用。

来源: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。

enter image description here