注意,ob_implicit_flush 的名字具有误导性。尽管它的名字如此,这个函数并不适用于用户输出缓冲区,即其他 ob_* 函数使用的缓冲区。它不会自动执行 ob_flush()。它会自动执行 flush()。两者是不同的。
例如,以下脚本
<?php
ob_implicit_flush();
for($i = 0; $i < 10; $i++)
{
echo "$i\n";
sleep(1);
}
?>
将等效于以下脚本
<?php
for ($i = 0; $i < 10; $i++)
{
echo "$i\n";
flush();
sleep(1);
}
?>
如果在 php.ini 中将 'output_buffering' 设置为 'on',那么该脚本将不会输出任何内容,直到结束。不幸的是,据我所知,没有办法在每次输出后执行隐式 ob_flush()。
如果你希望输出在生成时立即输出,一种解决方案是在脚本开头添加 ob_end_clean() 或 ob_end_flush()
<?php
ob_end_flush();
ob_implicit_flush();
for ($i = 0; $i < 10; $i++)
{
echo "$i\n";
sleep(1);
}
?>
这将按顺序输出。这只有在你只想让一部分输出实时输出,而其他部分则被缓冲时才会出现问题。在这种情况下,由于没有函数可以每执行一次 ob_flush() 就执行一次隐式 ob_flush(),因此你需要显式调用它。例如,以下代码有效
<?php
ob_start(); // 如果在 php.ini 中将 output_buffering 设置为 on,则不需要此行
ob_implicit_flush(); // 在每次 ob_flush() 后隐式调用 flush()
echo "This output is buffered.\n";
echo "As is this.\n";
for ($i = 0; $i < 10; $i++)
{
echo "$i\n";
ob_flush();
sleep(1);
}
?>
还要注意,某些浏览器可能会等到它们获得一定数量的输出后才开始输出。有关详细信息,请参见 flush [ https://php.net/manual/en/function.flush.php ]。我使用 Firefox(Iceweasel 17.0)就是这种情况;除非我在开头输出 1024 字节,否则它不会开始输出。