摘要:默認為是一個回調函數,將腳本的所有輸出,用所定義的函數進行處理。在輸出緩沖區的回調函數中使用這些函數,會導致未定義的錯誤。
簡介
PHP有輸出時,可以用輸出控制函數來控制輸出
緩沖階段ob_start(),將內部緩沖區(buffer)打開。當PHP遇到echo,printf等輸出語句時, PHP就會將要輸出的數據放入緩沖區(buffer)中,等待輸出。而只有當緩沖區滿了或者php運行完畢,才將數據輸出去。輸出字節離開PHP緩沖區進去Apache緩沖區或者Nginx緩沖區(fast-cgi),之后進入瀏覽器緩沖區。如下所示:
echo,print -> php buffer -> web server buffer(apache緩沖區,fast-cgi緩沖區) -> browser buffer
php.ini的配置項下面這些函數的行為受php.ini中的設置影響。
1.output_buffering
設置為 On 時,打開內部緩沖區(buffer)
設置為 Off 時,關閉內部緩沖區(buffer)
設置為數字時, 限制輸出緩沖區的最大值
在php.ini里,output_buffering=4096是默認開啟的。而此時使用ini_set()去改變output_buffering的值, 無法生效。因為輸出緩沖區層在php程序啟動的時候,就已經打開了。所以只能通過編輯php.ini改變其初始值或者是在執行PHP程序的時候使用-d選項才能改變它們的值。
2.output_handler
默認為NULL
是一個回調函數,將腳本的所有輸出,用所定義的函數進行處理。類似與ob_start($output_callback)。
$output_callback:
ob_gzhandler : 使用ext/zlib壓縮輸出
mb_output_handler : 使用ext/mbstring轉換字符編碼
ob_iconv_handler : 使用ext/iconv轉換字符編碼
ob_tidyhandler : 使用ext/tidy整理輸出的HTML文本
ob_[inflate/deflate]_handler : 使用ext/http壓縮輸出
ob_etaghandler : 使用ext/http自動生成HTTP的Etag
3.implicit_flush
設置為 On 時,打開絕對刷送。
PHP緩沖區層發送數據到web server buffer,Apache自動刷新輸出緩沖區,不需要等待刷新指令,直接就把輸出返回到browser buffer
設置為 Off 時,關閉絕對刷送。
不自動刷新apache緩沖區,接受到數據后,等待刷新指令
在php.ini里,implicit_flush=Off是默認關閉的。如果想要刷新Apache緩沖區,使用PHP的flush()函數手動刷新。或者調用ob_implicit_flush()(隱式刷送)函數。
ob_*系列函數 ob_flush和flush區別使用的時候我們經常一起使用
if (ob_get_level() == 0) ob_start(); for ($i = 0; $i<10; $i++){ echo "
Line to show."; echo str_pad("",4096)." "; ob_flush(); flush(); sleep(2); } echo "Done."; ob_end_flush();
但是ob_*系列的函數是操作php buffer,而flush則是操作web server buffer(活著特指上面所提到的Apache緩沖區)。
應用場景1.首先肯定是提高性能,減少響應次數
2.修改http頭信息
我們輸出消息到頁面表示請求和響應已經完成了,是不能再發送http頭信息了。但是使用緩沖區就不一樣了
ob_start(); echo "Hello "; setcookie("cookiename", "cookiedata"); ob_end_flush();
在上面的例子中,echo函數的輸出將一直被保存在輸出緩沖區中直到調用 ob_end_flush() 。同時,對setcookie()的調用也成功存儲了一個cookie,而不會引起錯誤。
3.避免內存限制
對于大文件來說, 開啟PHP緩沖區, 一段一段的讀取數據到瀏覽器,避免用戶等待,也避免一次讀取數據讀取耗盡內存。
4.靜態文件緩存
使用緩沖區生成靜態html文件
ob_start("ob_gzhandler"); $content = ob_get_contents(); // 打開文件 $file = fopen("./index.html", "w"); // 將緩沖區中的內容寫入文件 fwrite($file, $content); fclose($file); ob_end_clean();
5.處理輸出的內容
eg:進行gzip壓縮,進行簡繁轉換,或者進行一些字符串替換
參考資料:tips:不要在輸出緩沖區回調函數內調用任何緩沖區相關的函數,也不要在回調函數中輸出任何東西。是因為有些PHP的內部函數也使用了輸出緩沖區,它們會疊加到其他的緩沖區上,這些函數會填滿自己的緩沖區然后刷新,或者是返回里面的內容。eg:print_r()、highlight_file()和highlight_file::handle()等。在輸出緩沖區的回調函數中使用這些函數,會導致未定義的錯誤。
[ 1 ] : 深入理解php的輸出緩沖區(output buffer)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/22871.html
摘要:的部分是基于以及協議的。例如父進程向中寫入子進程從中讀取子進程向中寫入父進程從中讀取。默認使用對進程進行分配交給對應的線程進行監聽線程收到某個進程的數據后會進行處理值得注意的是這個線程可能并不是發送請求的那個線程。 作者:施洪寶 一. 基礎知識 1.1 swoole swoole是面向生產環境的php異步網絡通信引擎, php開發人員可以利用swoole開發出高性能的server服務。...
閱讀 658·2021-11-23 09:51
閱讀 3258·2021-10-11 10:58
閱讀 15407·2021-09-29 09:47
閱讀 3529·2021-09-01 11:42
閱讀 1281·2019-08-29 16:43
閱讀 1832·2019-08-29 15:37
閱讀 2089·2019-08-29 12:56
閱讀 1719·2019-08-28 18:21