日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

php 缓冲区,PHP的输出缓冲区

發布時間:2023/11/27 生活经验 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的输出缓冲区的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。