您好,登錄后才能下訂單哦!
這篇文章主要介紹php如何關閉緩沖區,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
php關閉緩沖區的方法:1、打開PHP安裝目錄,找到并打開配置文件“php.ini”;2、在配置文件中,找到“output_buffering”項,將該項的值設置為“Off”即可。
本教程操作環境:windows7系統、PHP7.1版,DELL G3電腦
PHP 緩沖區(buffer)
腳本輸出信息首先放入buffer,只有當buffer滿了或者腳本運行完畢,數據才會往下一階段轉移。在配置文件php.ini可以找到output_buffering
設置項,我的默認配置(Windows/XAMPP v3.2.2)是4096
若設置成On,緩沖區可用且無大小限制;
若設置為Off,緩沖區不可用;
若設置為整數,緩沖區可用且為設置大小,單位字節
需要注意的是,ini_set無法設置buffer大小,在初始化腳本運行環境時,已經做好了buffer的定義;cli模式下始終默認output_buffering為Off。
那么問題來了,緩沖區關閉和打開有什么區別?緩沖區初始設置的大小有什么作用?cli模式默認關閉若業務需要能開啟嗎?緩存區存在有什么好處?
1. 緩沖區關閉和打開有什么區別?
通過代碼檢驗
output_buffering配置為4096時,運行代碼
輸出結果:在等待3秒鐘后,同時輸出了start和end
Output_buffering配置為Off時,運行相同代碼
輸出結果:先輸出了start,等待3秒鐘后,輸出了end
單一看結果一模一樣啊~但是觀察其運行過程發現了很驚訝的不同點。若緩沖關閉,先輸出“start”,等待3秒后再輸出“end”。而緩沖開啟,會等待腳本執行完成,一并輸出結果
這個例子中,flush用于刷新apache的緩沖區,類似讓PHP buffer與瀏覽器建立直接聯系,好讓我們的注意力能夠專注PHP buffer本身。
通過一個形象的例子比喻,PHP的緩沖區像一個大房子,每次echo等輸出函數執行時,將數據扔到這個大房子里,直到腳本執行完成或執行ob_flush函數,將數據從大房子中釋放,扔給了WebServer緩沖區。關閉了PHP緩沖區后,echo函數執行,沒有大房子可以放怎么辦呢,就只好直接交給WebServer緩沖區了。
通過例子和代碼執行結果,我們能夠明白,所謂PHP buffer,是PHP本身開辟的數據存儲中樞站,一系列的ob函數都是為此操作。(舉幾個例子函數)
ob_clean(); //刪除內部緩沖區的內容,不關閉緩沖區(不輸出)。
ob_end_clean(); //刪除內部緩沖區的內容,關閉緩沖區(不輸出)。
ob_get_contents(); //返回緩沖區的內容,不輸出
ob_get_length(); //返回內部緩沖區的長度,如果緩沖區未被激活,該函數返回FALSE。
2. 緩沖區初始設置的大小有什么作用?
將output_buffering從4096改為5,方便執行測試
執行代碼
輸出說明:等待3秒后,輸出1234end
執行代碼
輸出說明:輸出12345,等待3秒后,輸出end
通過輸出的比較,很能說明區別了。
緩沖區只能放5字節的數據,放進來的小于這個最大值,還能先存存放放,要是大于等于臨界值,那就只好將數據踢出去了,這就跟我們手動執行了ob_flush函數一個效果。
3. cli模式默認關閉若業務需要能開啟嗎?
這個問題可以做個補充,非cli模式下,如果php.ini設置緩沖區關閉,但是業務需要用到buffer,咋整呢,難不成還要去改配置。當然不會那么難搞了,這時候又一個ob函數來了,
ob_start(); //打開一個輸出緩沖區,所有的輸出信息不再直接發送到瀏覽器,而是保存在輸出緩沖區里面。
知道了PHP buffer類似數據臨時存儲區的概念,回過頭再來看看TP5源碼。
先看看ob_get_level和ob_get_clean函數解釋
ob_get_level() :返回輸出緩沖機制的嵌套級別。
ob_get_clean():得到當前緩沖區的內容并刪除當前輸出緩沖區。
從代碼中也能得知一二,若level獲取大于0,獲取緩沖區的內容并刪除緩沖區,再通過ob_start打開一個新的,這也很符合注釋里說明的“重新申請”。
這里解釋下所謂的嵌套,至于level的值啥時候會為0,并且非0的話是什么呢,請將php.ini output_buffering關閉,輸出看看結果。另外多次ob_start,多次ob_get_level,來試試對比輸出結果吧。
先來看看兩種模型
在多次ob_start打開新的緩沖區時,數據結構的構造為第二種,這就是嵌套了。ob_get_level返回了嵌套的級別。
個人理解,嵌套可以套用Java的流機制來類比,一個緩沖區的數據輸出到下一個緩沖區,然后可以對數據做定制化的操作。
現在看TP5源碼,思路就比較清晰了。如果系統初始化了緩沖區,因為大小可能會有限制,所以先刪除再重新打開。而執行ob_start打開的緩存區,它的大小“足夠大”,但是到底有多大,暫時沒有查到具體的說明,只知道,不管寫入數據多大,都會直到腳本結束才會發送
4. 緩存區存在有什么好處?
PHP輸出數據發送到WebServer,若echo執行一次發送一次,這加大了資源消耗,不如存儲在內存中,統一發送更有效率。
Web請求包含HTTP頭部,頭部在設置之前不能有任何的輸出。PHP緩沖區替我們做好了這步工作,在頭部發送前輸出各種數據,緩沖區會先將頭部信息發送到WebSever,再統一發送數據報文。
以上是“php如何關閉緩沖區”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。