8

如何在发生时从 php 获取实时输出?无需将所有内容存储在内存/缓冲区中并立即将所有内容回显到浏览器?

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

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

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

0123456789

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

0

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

idk 它所谓的动画/实时。

如何做到这一点?

我正在做一个项目,我需要在它发生时持续输出,这样我就可以密切关注正在发生的事情以及它的去向。

谢谢

4

3 回答 3

8

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-30T01:24:59.067 回答
4

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

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

于 2013-09-30T12:33:25.980 回答
4

可以打开输出缓冲,这会阻止实时输出。所以你需要一个echoflush()and的组合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。

在此处输入图像描述

于 2018-10-25T09:39:42.900 回答