php 缓冲区,PHP的输出缓冲区
PHP的輸出緩沖區
在PHP中有一個名為“輸出緩沖區”「ob」的東西。PHP的輸出流包含很多字節,通常是echo語句或者printf()函數輸出的。這些東西的數據需要用到輸出緩沖區。
一般PHP的輸出就是按照上面這張圖在各個緩沖區間流轉,但是cli模式下有些特殊。在cli模式下ini的配置中_output_buffer_選項強制設置為0、_implicit_flush_的值也會被設置為1。output_buffer=0: 表示禁用默認PHP輸出緩沖區。所以在cli中國呢,默認情況下你要輸出的東西會直接傳遞到SAPI層,除非你手動調用ob_()類函數。
_implicit_flush=1: _當_implicit_flush_被設置為打開(值為1),一旦有任何輸出寫入到SAPI緩沖區層,它都會立即刷新(flush,意思是把這些數據寫入到更低層,并且緩沖區會被清空)。一般會是標準輸出管道,write()和fflush()這兩個函數就是負責干這個事情的。
默認輸出緩沖區
關于緩沖區的配置選項的值會在PHP程序啟動的時候,還沒有運行任何腳本之前解析,所以在腳本啟動之后使用ini_set()去設置是沒有效果的。
在web應用環境中對輸出的內容使用緩沖區對性能有好處。這意味著你可以先寫入一些字符,然后再跟下面的SAPI層通信。并且在web應用環境中,通過socket一個字節一個字節的傳輸消息的方式對性能并不好。更好的方式是把所有內容一次性傳輸給服務器,或者至少是一塊一塊地傳輸。層與層之間的數據交換的次數越少,性能越好。
對于FastCGI協議,刷新操作(flushing)是每次寫入后都發送一個FastCGI數組包(packet),如果發送數據包之前先把FastCGI的緩沖區寫滿會更好一些。
可以使用flush()函數顯式刷新SAPI緩沖區。
用戶輸出緩沖區
使用ob_start()創建用戶輸出緩沖區。這些緩沖區組成一個堆棧結構,每個新建緩沖區都會堆疊到之前的緩沖區上,每當它被填滿或者溢出,都會執行刷新操作,然后把其中的數據傳遞給下一個緩沖區。// web請求立即返回,然后后臺繼續執行任務。
echo json_encode(['code' => 200]);
$size = ob_get_length();
header("Content-Length: $size");
header('Connection: close');
ob_end_flush();
ob_flush();
fastcgi_finish_request();
// flush();
//在關閉連接后,繼續運行php腳本
ignore_user_abort(true);
// 不設置超時時間
set_time_limit(0);
// 繼續執行任務
關于fastcgi_finish_request()此函數flush所有響應的數據給客戶端并結束請求。使得客戶端結束連接后,服務端可以繼續運行耗時任務。
fastcgi_finish_request()之后, 腳本仍然會占用一個FPM進程。
當前FPM進程會被阻塞,這意味著因為會話而鎖定一個進程的請求會被阻塞,直到會話被關閉,可以通過session_write_close()主動關閉會話。
總結
以上是生活随笔為你收集整理的php 缓冲区,PHP的输出缓冲区的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 采开头的成语有哪些啊?
- 下一篇: 2008php多版本共存,lnmp安装多