如何从PHP获得实时输出?

AMB*_*AMB 7 php real-time echo

如何从PHP获得实时输出?没有全部存储在内存/缓冲区中并立即回显浏览器?

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

<?php
for($i = 0; $i < 10; $i++)
{
echo $i;
sleep(1);
}
Run Code Online (Sandbox Code Playgroud)

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

0123456789
Run Code Online (Sandbox Code Playgroud)

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

0

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

idk是什么叫做动画/实时.

怎么做到这一点?

我正在研究我需要恒定输出的项目,所以我可以留意发生的事情和它的发展方向.

谢谢

Pau*_*ich 7

flush()希望显示当前输出时使用功能.

一个简单的例子:

<?php
for ($i = 1; $i <= 10; $i++)
{
   echo '<p>' . $i . '</p>';
   flush();
   sleep(1);
}
?>
Run Code Online (Sandbox Code Playgroud)

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

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

像这样的东西:

<?php
echo str_repeat(" ", 256); 
flush();
?>
Run Code Online (Sandbox Code Playgroud)

工作示例(没有ob_start()功能):

<?php
echo str_repeat(" ", 256);
for ($i = 1; $i <= 10; $i++)
{
    sleep(1);
    echo '<p>' . $i . '</p>';
    flush();
}
?>
Run Code Online (Sandbox Code Playgroud)


Jul*_*ian 6

输出缓冲可能会打开,这会阻止实时输出。所以你需要和echo的组合。flush()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 />';
Run Code Online (Sandbox Code Playgroud)

我试图创建一个小提琴,但sleep()在小提琴中不允许。所以我创建了一个 GIF。

在此输入图像描述


Laj*_*pad 5

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

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