PHP Conference Japan 2024

ob_flush

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

ob_flush刷新(傳送)作用中輸出處理器的傳回值

說明

ob_flush(): bool

此函式會呼叫輸出處理器(使用 PHP_OUTPUT_HANDLER_FLUSH 旗標),刷新(傳送)其傳回值,並捨棄作用中輸出緩衝區的內容。

此函式不會像 ob_end_flush()ob_get_flush() 一樣關閉作用中輸出緩衝區。

若沒有以 PHP_OUTPUT_HANDLER_FLUSHABLE 旗標啟動的作用中輸出緩衝區,則 ob_flush() 將會失敗。

參數

此函式沒有參數。

傳回值

成功時傳回 true,失敗時傳回 false

錯誤/例外

如果函式失敗,它會產生 E_NOTICE

參見

  • ob_start() - 開啟輸出緩衝
  • ob_get_contents() - 傳回輸出緩衝區的內容
  • ob_end_flush() - 刷新(傳送)作用中輸出處理器的傳回值並關閉作用中輸出緩衝區
  • ob_get_flush() - 刷新(傳送)作用中輸出處理器的傳回值、傳回作用中輸出緩衝區的內容並將其關閉
  • ob_clean() - 清理(抹除)作用中輸出緩衝區的內容

新增註解

使用者貢獻的註解 10 則註解

Lee
12 年前
截至 2012 年 8 月,所有瀏覽器似乎都採用全有或全無的緩衝方法。換句話說,當 php 正在運作時,無法顯示任何內容。

特別是這意味著此處列出的以下變通方法無效

1) ob_flush()、flush() 與其他輸出緩衝函式的任何組合;

2) 變更 php.ini,將 output_buffer 和/或 zlib.output_compression 設定為 0 或 Off;

3) 設定 Apache 變數,例如透過 apache_setenv() 或 .htaccess 中的條目設定 "no-gzip"。

因此,在瀏覽器開始再次顯示緩衝內容之前,此處列出的提示都是沒有意義的。
dermeister dot online at gmail dot com
12 年前
定義內容型別標頭可以解決 ob_flush() 和 flush() 的一些問題
header('Content-type: text/html; charset=utf-8');

所以可運作的程式碼如下
<?php
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 />';
?>
thecichos at gmail dot com
1 年前
當伺服器傳回代碼 206 並暫時將 output_buffering 設定較低以讓其填滿時,輸出緩衝區似乎效果最佳

這會告知瀏覽器等待其他內容
例如
// 將標頭設定為 206
header("HTTP/1.1 206 Partial Content; Content-Type: text/html; charset=utf-8");

// 刷新目前輸出緩衝區
flush();
ob_flush();
ob_end_flush();

// 建立新的輸出緩衝區
ob_start();

// 儲存目前輸出緩衝區大小
$tempBuffering = ini_get("output_buffering");

// 設定新的、小得多的緩衝區大小
ini_set("output_buffering", 256);

// 執行一些緩衝
!!! 您所有精彩的程式碼都放在這裡 !!!

// 如果需要,使用一些內容填滿緩衝區
echo str_pad(" ", (int)ini_get("output_buffering"), " ");
flush();
ob_flush();

// 還原緩衝區大小
ini_set("output_buffering", $tempBuffering);
chris - latko - org
9 年前
儘管瀏覽器現在具有全有或全無的緩衝策略,但這些參數並非沒有意義。

如果您未使用 ob_flush,則會有超出 socket 超時的風險(在 php-fpm/nginx 組合中很常見)。

基本上,刷新可以解決臭名昭著的 504 Gateway Time-out 錯誤。
Jens
16 年前
如果您呼叫 ob_flush() 和 flush() 仍然無法刷新緩衝區,原因可能是某些防毒軟體(在此案例中為 Panda)會將緩衝區保留到頁面載入完成後才傳送到瀏覽器。
jake at qzdesign dot co dot uk
6 年前
如果沒有作用中輸出緩衝區,則會產生 E_NOTICE 等級的錯誤(至少在 PHP 7.1 中)。若要避免此錯誤,請先使用 `ob_get_level()` 測試。
riimeik
14 年前
如果您仍然無法正確取得緩衝區,請嘗試在開始您自己的緩衝區之前清理所有其他緩衝區(即使 PHP 告訴您沒有作用中緩衝區)

while(@ob_end_clean());
Anonymous
19 年前
我遇到輸出緩衝的問題,該問題似乎在伺服器上預設為啟用,儘管 phpinfo 說的是其他情況..

在任何情況下,我都需要知道當我執行 ob_start 時,它會從最上層開始,這樣我就可以使用 ob_flush,就像它的預期用途一樣,而不必在腳本中呼叫多個 ob_flush - 這就是我做的

<?php

// 在我們開始之前,請確保輸出緩衝已關閉
// 這將確保無論 ob 是否已啟用,都具有相同的效果
while (ob_get_level()) {
ob_end_flush();
}
// 開始輸出緩衝
if (ob_get_length() ===false) {
ob_start();
}

?>

然後我可以呼叫 ob_flush(); 後接 flush(); 並取得我想要的輸出,如果我只用 ob_start(); 開始腳本,我不會取得想要的輸出

這是在 Windows Apache 2 伺服器上使用 php 5.0.4 的情況。
colnector at@ colnect punto com
16 年前
如 flush() 手冊條目所述,如果 php 使用 zlib 壓縮輸出,此函式可能無效。

在您伺服器上具有可能需要很長時間才能執行腳本的資料夾上,可能的一個選項是在您相關的 .htaccess 檔案中加入以下內容

<FilesMatch "\.(php|html?)$">
php_flag zlib.output_compression off
php_value max_execution_time 3000
php_value max_input_time 3000
</FilesMatch>
sebastian at jcompare dot com
15 年前
由於某些原因,單獨呼叫 flush 或 ob_flush,甚至兩者一起呼叫都無法清空我的輸出緩衝區。單獨呼叫 ob_end_flush 也無效,但全部一起呼叫卻能正常運作。以下是我的新輸出緩衝區清除函式。

<?php
function flush_buffers(){
ob_end_flush();
ob_flush();
flush();
ob_start();
}
?>

請享用
To Top