首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在发生时从php获得实时输出?

如何在发生时从php获得实时输出?
EN

Stack Overflow用户
提问于 2013-09-30 09:23:15
回答 3查看 19.6K关注 0票数 8

如何在发生时从php获得实时输出?而无需将所有内容存储在内存/缓冲区中,并一次性回显到浏览器?

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

代码语言:javascript
复制
<?php
for($i = 0; $i < 10; $i++)
{
echo $i;
sleep(1);
}

并从Internet浏览器访问它,它在9-10秒后给出以下输出。

代码语言:javascript
复制
0123456789

但我希望输出的是,当我从我的浏览器访问php文件时,它应该提供

然后等待1秒,然后在"0“之后添加"1”,然后等待1秒,然后在"1“之后添加"2”,依此类推。

idk它所说的像动画/实时。

如何实现这一点?

我正在工作的项目中,我需要不断的输出,因为它发生了,所以我可以密切关注发生了什么和它的发展方向。

谢谢

EN

回答 3

Stack Overflow用户

发布于 2013-09-30 09:24:59

当您想要显示当前输出时,使用flush()函数。

一个简单的例子:

代码语言:javascript
复制
<?php
for ($i = 1; $i <= 10; $i++)
{
   echo '<p>' . $i . '</p>';
   flush();
   sleep(1);
}
?>

如果使用输出缓冲,则还需要调用ob_flush()

注意:某些版本的Microsoft Internet Explorer只有在接收到256字节的输出后才会开始显示页面,因此您可能需要在刷新之前发送额外的空格,以使这些浏览器显示页面。

如下所示:

代码语言:javascript
复制
<?php
echo str_repeat(" ", 256); 
flush();
?>

工作示例(不带ob_start()函数):

代码语言:javascript
复制
<?php
echo str_repeat(" ", 256);
for ($i = 1; $i <= 10; $i++)
{
    sleep(1);
    echo '<p>' . $i . '</p>';
    flush();
}
?>
票数 8
EN

Stack Overflow用户

发布于 2013-09-30 20:33:26

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

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

票数 4
EN

Stack Overflow用户

发布于 2018-10-25 17:39:43

可以打开输出缓冲,这会阻止实时输出。因此,您需要一个结合了flush()ob_flush()echo

来源:http://php.net/manual/en/function.ob-flush.php#109314

代码语言:javascript
复制
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。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19085188

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档