请注意,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(),因此您需要显式调用它。例如,这有效
<?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 字节,否则它不会开始输出。