關於上述範例的註解...
使用 PHP 4 >= 4.2.0, PHP 5,您可以結合使用 ob_get_level() 和 ob_end_flush() 來避免使用 @(錯誤抑制),這可能會更快一些。
<?php
while (ob_get_level() > 0) {
ob_end_flush();
}
?>
(PHP 4, PHP 5, PHP 7, PHP 8)
ob_end_flush — 沖刷 (送出) 目前作用中輸出處理器的傳回值,並關閉作用中輸出緩衝區
此函式會呼叫輸出處理器 (使用 PHP_OUTPUT_HANDLER_FINAL
旗標),沖刷 (送出) 其傳回值,捨棄作用中輸出緩衝區的內容,並關閉作用中輸出緩衝區。
如果沒有使用 PHP_OUTPUT_HANDLER_REMOVABLE
旗標啟動的作用中輸出緩衝區,ob_end_flush() 將會失敗。
ob_end_flush() 會將輸出處理器的傳回值刷新(送出),即使啟用的輸出緩衝區是在沒有 PHP_OUTPUT_HANDLER_FLUSHABLE
旗標的情況下啟動的。
此函式沒有參數。
如果函式失敗,它會產生一個 E_NOTICE
。
範例 #1 ob_end_flush() 範例
以下範例顯示了刷新並結束所有輸出緩衝區的簡單方法
<?php
while (@ob_end_flush());
?>
關於上述範例的註解...
使用 PHP 4 >= 4.2.0, PHP 5,您可以結合使用 ob_get_level() 和 ob_end_flush() 來避免使用 @(錯誤抑制),這可能會更快一些。
<?php
while (ob_get_level() > 0) {
ob_end_flush();
}
?>
壓縮 CSS 程式碼的最佳方法
<?php
header('Content-type: text/css');
ob_start("compress");
function compress($buffer) {
// 移除註解
$buffer = preg_replace('!/\*[^*]*\*+([^/][^*]*\*+)*/!', '', $buffer);
// 移除定位字元、空格、換行符號等。
$buffer = str_replace(array("\r\n", "\r", "\n", "\t", ' ', ' ', ' '), '', $buffer);
return $buffer;
}
include('./template/main.css');
include('./template/classes.css');
<?php
ob_end_flush();
?>
在 <head> 中引入
<link rel="stylesheet" type="text/css" href="/design.php" media="all" />
如果啟用 zlib.output_compression,則層級計數將會增加 1,然後這段程式碼
<?php while (ob_get_level()) { ob_end_clean(); } ?>
將會凍結你的程式。
看來不論是否已使用 ob_start() 啟動輸出緩衝,都可以呼叫 ob_end_flush()。這點很有用,因為它可以省去你根據特定函式或引入檔案是否已啟動輸出緩衝來建立條件式陳述句。你可以直接呼叫 ob_end_flush(),如果緩衝區中有輸出,它就會被送出,否則你的程式碼就會繼續執行。
想要加快速度,並在頁面傳送到客戶端後進行一些處理。這幾乎讓我抓狂,但最後,我找到了解決方案 (php 5.2.5)
<?php
ob_start(); // 外層緩衝區
ob_start(); // 內層緩衝區,用於捕捉 URL 重寫和其他後續處理
session_start(); // 向內層緩衝區註冊 URL 重寫器!
echo '...';
// 在傳送頁面*之後*將效能數據記錄到日誌檔!
register_shutdown_function(array($benchmarkclass,'log_perf_data'));
// 現在將輸出刷新到客戶端
ob_end_flush();
// 需要在 URL 重寫*之後*計算內容長度!
header("Content-length: ".ob_get_length());
ob_end_flush();
// 現在我們關閉 session 並執行一些使用 register_shutdown_function() 註冊的任意清理任務
session_write_close();
?>
除了大部分是多餘的之外,在某些奇怪的情況下,ob_end_flush() 可能會造成損害。
實際範例:在內部網路網站上的一個特定頁面,當一開始呼叫 ob_start('ob_gzhandler') 並在最後呼叫 ob_end_flush() 時,在 Internet Explorer 6 上會顯示空白。
無論我們怎麼嘗試,都無法找出是什麼讓該頁面如此特殊。ob_ 函式被放置在所有頁面都 include() 的腳本中,但只有該頁面會發生這種情況。
更奇怪的是,這個問題只出現在瀏覽器/伺服器直接連線時。只要連線通過代理伺服器,問題就會消失。我猜測是某種 HTTP 編碼標頭的緣故。
解決方案:除非在特定情況下真的需要,否則請移除 ob_end_flush() 呼叫,並依靠內建的自動緩衝區刷新機制。
注意:在 IIS 中,刷新輸出緩衝區的功能在您將以下內容添加到 web.config 檔案的 PHP 處理常式下方之前無法運作:
responseBufferLimit="0"
我是在只有當腳本失敗時才會取得 SSE 輸出時發現這個問題的。
如果您正在迴圈中執行,ob_end_flush() 似乎非常重要。例如,如果您正在使用大量郵件發送器,該發送器使用輸出緩衝區來建立 HTML 內容。使用 ob_end_flush() 可以避免伺服器錯誤。
在*大多數*情況下不需要 ob_end_flush(),因為當輸出緩衝區在 php.ini 中或透過呼叫 ob_start() 開啟時,PHP 本身會在腳本執行結束時自動呼叫它。
請記住,Chromium 瀏覽器(也許還有其他基於 WebKit 的瀏覽器)在使用 ob_end_flush() 時會出現一些問題。
http://code.google.com/p/chromium/issues/detail?id=31410
如果您不需要 html,可以使用
header("Content-Type: text/plain");
來解決這些問題。