請注意,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 已開啟,則不需要此行
ob_implicit_flush(); // 在每次 ob_flush() 之後隱式呼叫 flush()
echo "這段輸出會被緩衝。\n";
echo "這段也是。\n";
for ($i = 0; $i < 10; $i++)
{
echo "$i\n";
ob_flush();
sleep(1);
}
?>
另請注意,某些瀏覽器可能會等到它們收到一定量的輸出才會顯示。詳情請參閱 flush [ https://php.dev.org.tw/manual/en/function.flush.php ]。我使用 Firefox (Iceweasel 17.0) 時就遇到這種情況;除非一開始就輸出 1024 位元組,否則它不會開始輸出。