为什么PHP脚本在任何echo / output之前等待“完成脚本”?

时间:2014-02-05 17:01:19

标签: php echo

考虑一个简单的脚本

<?php 
echo "hi";
foreach ($_GET['arr'] as $a)
{
 echo $a ."<br>";
}
echo "<p>Masel tov</p>";
foreach ($_GET['arr2'] as $a)
{
 echo $a ."<br>";
}

我希望脚本能够不断回应。相反,脚本在完成时会一次性回显。即使第一个“hi”在脚本完成后1分钟也会回显。

是否有防止这种情况发生的设置或为什么会这样?

5 个答案:

答案 0 :(得分:5)

根据您的配置,输出将缓存到完成。您可以使用ob_flush()flush()强制进行同花。遗憾的是,许多现代浏览器在页面加载完成之前也不会更新,无论你多久刷新一次。

PHP输出缓冲的配置设置。 http://www.php.net/manual/en/outcontrol.configuration.php

答案 1 :(得分:2)

有一个函数ob_implicit_flush可用于在每次输出调用后启用/禁用自动刷新。但在使用它之前,请查看PHP手册的注释。

答案 2 :(得分:1)

如果要逐个显示项目并保留适用于每个服务器设置的干净代码,您可以考虑使用ajax。我不喜欢刷新缓冲区,除非没有其他选项来完成任务。

如果您的项目不是webproject,您可以考虑在php控制台(命令行)中运行代码以立即接收输出。

答案 3 :(得分:0)

对此进行确认

if (ob_get_level() == 0)
{
    ob_start();
} 
for ($i = 1; $i<=10; $i++){
        echo "<br> Task {$i} processing ";
        ob_flush();
        flush();
        sleep(1);
}
echo "<br /> All tasks finished";
ob_end_flush();

答案 4 :(得分:-1)

正如您所注意到的那样,PHP会立即发送所有数据(脚本完成的那一刻) - 您搜索类似http://de1.php.net/manual/de/function.ob-get-contents.php的内容:

<?php

ob_start();

echo "Hello ";

$out1 = ob_get_contents();

echo "World";

$out2 = ob_get_contents();

ob_end_clean();

var_dump($out1, $out2);
?>