php中的緩,php中的緩存機制解釋

php緩存的理解,先列出ob系列函數的作用:

ob_start('func') 開啟php緩存,回調函數是對緩存內數據的處理函數

ob_gzhandler 作為 ob_start 的回調函數,對數據進行gz壓縮

ob_implicit_flush(true/false) ?打開或關閉apache緩存,打開apache緩存將直接將數據輸出給用戶瀏覽器,不必用buffer函數手動輸出

flush 將apache緩存區的數據發送出去TCP到用戶瀏覽器

ob_get_contents 獲取緩存內容

ob_get_length 獲取緩存內容長度

ob_get_level 返回緩存級別(每個ob_start將開啟一個重0編號的緩存區)

array ob_get_status() 返回當前緩存機制的一些信息

ob_list_handlers

void ? ?ob_flush ? ? ? ? ? ?送出當前緩存區內容到上一緩存區并保留當前緩存區

void ? ?ob_end_flush ?送出當前緩存區內容到上一緩存區銷毀(關閉)當前緩存區

string ob_get_flush ?送出當前緩存區內容到上一緩存區銷毀(關閉)當前緩存區 并返回緩沖區內容

void ? ?ob_clean ? ? ? ? ? ?清空當前緩沖區內容

void ? ?ob_end_clean ??清空當前緩沖區內容并銷毀(關閉)當前緩存區

string ob_get_clean ? ?清空當前緩沖區內容并銷毀(關閉)當前緩存區 并返回當前緩存區內容

緩存的整個機制如下圖所示:

0818b9ca8b590ca3270a3433284dd417.png

ob系列函數針對的都是 php bufer這塊

在php buffer中,每一個ob_start都會在php buffer中開啟一塊內存空間,并且支持多級嵌套,嵌套關系如圖

不嵌套的話 "php最終輸出緩存區"就是level0 ,嵌套級別的操作都是對上級緩存空間進行的操作 (level0 的上級緩存是Apache Buffer)

flush 函數是對Apache Buffer進行的操作,刷新Apache Buffer 發送數據走TCP到用戶瀏覽器

PHP Buffer :

在php.ini 中的選項 output_buffer 是控制php buffer的,當output_buffer = On 或者 output_buffer = number(num>0) 默認開啟緩存 ob_start不能控制php buffer

當 output_buffer=0 或者 output_buffer=Off 就是關閉緩存 在腳本中需要 通過 ob_start 函數開啟

output_buffer項不能通過 ini_set進行修改

Apache Buffer:

在php.ini中的選項implicit_flush= On/Off 開啟的話,Apache Buffer中的數據不會緩存而是直接發送出去

ob_implicit_flush(true/ false) 可以對這個選項進行設置

開啟Apache Buffer緩存后要想送出緩存中的數據需要用到函數 flush

很多時候 ob_flush flush 要結合使用:

ob_flush PHP Buffer->Apache Buffer

flush ? ? ? Apache Buffer->Browser

ob_flush ob_end_flush ob_get_flush 都有送出緩存內容的操作,這時的送出緩存都是送出到上一級別的緩存區域 最后一并輸出給Apache Buffer

關于PHP Buffer中的多級緩存:

每個ob_start 函數都會在PHP Buffer中開啟一個緩存區域,php會將這些區域進行編號(從0開始),可以通過 ob_get_level函數獲取編號

緩存嵌套的整個操作是將整個緩存進行合并最后一并發送給Apache Buffer

ob_flush函數是將當前編號內的內容送到上一編號并將php buffer中的內容發送到Apache Buffer

例子1:

ob_start();

echo "buffer1
";

ob_start();

echo "buffer2
";

ob_start();

echo "buffer3
";

ob_end_flush();

echo ob_get_level().'
';

ob_end_flush();

echo ob_get_level().'
';

ob_end_flush();

echo ob_get_level().'
';

輸出內容:

buffer1

buffer2

buffer3

2

1

0

從返回的level值可看出,整個嵌套級別是從后往前的

例子二:

ob_start();

echo "buffer1
";

ob_start();

echo "buffer2
";

ob_start();

echo "buffer3
";

ob_end_clean();

ob_end_flush();

ob_end_flush();

結果:

buffer1

buffer2

不出所料,先將 2 級別緩存的內容clean掉,1 ,0 級別的內容正常輸出

例子三:

ob_start();

echo "buffer1
";

ob_start();

echo "buffer2
";

ob_start();

echo "buffer3
";

ob_end_flush();

ob_end_clean();

ob_end_flush();

結果:

buffer1

從上面的例子可以總結下php緩存機制中嵌套中 整合輸出的過程如下

ob_start(); echo 'buffer1' 緩存如下 0:"buffer1"

ob_start(); echo 'buffer2' 緩存如下 1:"buffer2"---->0:"buffer1"

ob_start(); echo 'buffer3' 緩存如下 2:"buffer3"---->1:"buffer2"---->0:"buffer1"

如例子一中

第一次 ob_end_flush 緩存結構?1:"buffer2buffer3"---->0:"buffer1"

第二次?ob_end_flush 緩存結構 0:"buffer1buffer2buffer3"

第三次?ob_end_flush 緩存結構 發送內容到Apache Buffer

結果:buffer1buffer2buffer3

如例子二中

ob_end_clean?緩存結構?1:"buffer2"---->0:"buffer1"

ob_end_flush?緩存結構 0:"buffer1buffer2"

ob_end_flush 緩存結構 發送內容到Apache Buffer

結果:buffer1buffer2

如例子三中

ob_end_flush 緩存結構?1:"buffer2buffer3"---->0:"buffer1"

ob_end_clean?緩存結構 0:"buffer1"

ob_end_flush 緩存結構 發送內容到Apache Buffer

結果:buffer1

以上清楚的解釋了php中的緩存機制

理解了整個機制,函數的使用就簡單了 Good Luck

0818b9ca8b590ca3270a3433284dd417.png

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/534166.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/534166.shtml
英文地址,請注明出處:http://en.pswp.cn/news/534166.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

php 下拉菜單多選get,Jquery實現select二級聯動多選下拉菜單

前言平時雖然也有寫前端,但是對于一些復雜的功能實現仍是一知半解。這次項目需要實現一個多選下拉菜單,并且該菜單要和上級下拉菜單保持聯動。更加麻煩的是,我需要完成以下操作,以省、市二級聯動菜單為例:選擇河北省 &…

idea快捷鍵打開run的窗口_看了上篇文章,你不了解的IDEA操作……

注意作者:卡洛小豆。換種方式寫文章,寫的不好請多多見諒。未經授權,禁止轉載夜,結束了一天的喧囂后安靜下來,伴隨著遠處路燈那微弱的光。風,毫無預兆地席卷整片曠野,撩動人的思緒萬千。那是一個…

oracle查看物化視圖的索引,oracle – 物化視圖中的域索引返回零行

我有Oracle DB的問題 – 在物化視圖上通過CONTAINS()搜索后,域索引返回零行.我看到物化視圖充滿了數據,我還使用過程ctx_ddl.sync_index()進行域索引同步.什么有用:>創建表>插入數據>創建域索引> SYNC DOMAIN INDEX>通過包含找到行 – 返回行什么不起…

arma模型_Eviews經典案例 | 初學者必看!ARMA模型精講

【本期分析師介紹】希音老師,《數據分析學堂》金牌分析師,對eviews的時間序列、ARMA、VAR、VECM、ARCH、GARCH等操作有深入的研究和實戰經驗,累計服務客戶1000。今天邀請希音老師給大家分享eviews的詳細操作步驟。長文預警!可在文末聯系麻瓜學…

oracle活躍用戶,監控數據庫中的活躍用戶及其運行

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓[sql] view plain copy print?set linesize 120 pagesize 66col c1 for a9col c1 heading "OS User"col c2 for a9col c2 heading "Oracle User"col b1 for a9col b1 heading "Unix PID"col b2 for…

c# 路徑下的最近文件夾_C#8.0的兩個有趣的新特性以及gRPC

最近每天忙著跑很多地方,回家就不想動了,沒什么心情寫東西。今天有空,稍微寫一點。下文中:關于C#語法特性的部分需要Visual Studio 2019支持。關于.NET Core的部分需要安裝.NET 3.0 Preview4,低版本或許也可以但我沒實…

alter table add column多個字段_ElementUI表格el-table表頭固定自適應高度解決方案

一、前言ElementUI、iView都以相同的方式提供了表格組件表頭固定的方法,即設置組件的height屬性。表頭固定很重要,就在于當表格數據項很多時,滾動條出現在表格組件內,而不是出現在表格組件外——這樣的優點在于,滾動瀏…

oracle ora 12011,執行oracle中的job報錯:ORA-12011:無法執行作業1

LZ在做一個job執行每天新增一個表的操作時,存儲過程運行沒問題,job也創建成功,但運行job時,卻報錯: ,后又用sys用戶登陸創建了同樣的存儲過程和job,結果可以執行成功。當時就猜測是權限問題。后…

e盤是否具有讀寫權限_輕松搭建MySQL主從復制、讀寫分離(雙機熱備)

主從復制: 當mysql數據庫的數據量太大的時候,查詢數據就很吃力了,無論怎么優化都會產生瓶頸,這時我們需要增加服務器設備來實現分布式數據庫,實現多機熱備份,要想實現多機的熱備,首先要了解主從…

linux運維之道基礎命令,Linux運維之道(7)——Linux管理類命令

(Linux)[系統管理]1. 目錄管理類命令1.1 cd命令格式:cd [-L|[-P [-e]] [-]] [dir]被你忽略的小知識:在這里科普一個小小的知識點,就是關于cd -為什么可以自由的在當前目錄和之前目錄相互切換?其實,在我們的 Shell 的環…

html畫圖代碼_python之matplotlib畫圖教程(2)

各位小表貝,你們的畫圖小老弟又來咯~上一次我們聊到了如何畫離散圖,這一次我們來點復雜的,準備好了么,系好安全帶,準備發車咯~滴滴~我們先來點比較簡單,那種易于上手的。如果現在我知道了兩個點的坐標&…

在linux上面找一個腳本,30個Linux Shell腳本經典案例

在學習Linux運維時,普遍反饋是:Linux Shell是一個很難的知識板塊。雖然大家都認真學,基本的語法也都掌握了,但有需求時,很難直接上手編程,要么寫了很久,要么寫不好!也有很多做運維很…

python圖像識別代碼_用Python進行簡單圖像識別(驗證碼)

這是一個最簡單的圖像識別,將圖片加載后直接利用Python的一個識別引擎進行識別 將圖片中的數字通過 pytesseract.image_to_string(image)識別后將結果存入到本地的txt文件中 #-*-encoding:utf-8-*- import pytesseract from PIL import Image class GetImageDate(ob…

linux 端口添加地址,linux – 綁定,網絡(接口)和多播地址有什么區別?

實際上你在這里混淆了三種方法.第一個是bind,用于將套接字綁定到指定的地址和端口.使用此方法基本上您打開一個udp-port并等待該地址上的此端口的數據.第二個是join-method,用于讓套接字加入指定的多播組.組播組的示例是224.0.0.1 – “所有主機”組播組 – 其針對同一網段上的…

c++ map初始化_Go學習每日一問(18)-map元素查找

每次學習并整理一個Golang的知識點,每天進步一點點。今天學習下go中的一個知識點:map元素查找日省吾身1.下面代碼中 A B 兩處應該怎么修改才能順利編譯?func main() { var m map[string]int //A m["a"] 1 if v : m["b&q…

linux運維需要哪些網絡知識,Linux運維學習筆記-網絡技術知識體系總結

jTemplates部分語法介紹1.{#if} {#if |COND|}..{#elseif |COND|}..{#else}..{#/if} Examples: {#if 2*816} good {#else} fail {# ...解密jQuery內核 DOM操作方法(二)html,text,val回顧下幾組DOM插入有關的方法 innerHTML 設置或獲取位于對象起始和結束標簽…

-bash: wget: 未找到命令_18個堪稱神器的命令行工具,高效運維必備

上期入口:24個 CSS 高級技巧合集提示:因公眾號不支持超鏈接,上圖所有項目地址,可在公眾號后臺回復關鍵字 “命令行工具” 獲取。thefuck命令行打錯了以后,打一個fuck就會自動糾正。GitHub:https://github.c…

linux編輯java文本,linux下的文本編輯器VI的使用命令

1、 移動光標H        #移到屏幕的左上角M         #移到屏幕的中間行開頭L          #移到屏幕的最后一行[         #移到文件開始位置 (雙擊)]         #移到文件結束位置(雙擊):n         #移到文件的第n行Ctrl b     …

python3.8.0安裝_Python3.8.0

Python3.8.0是一款廣受程序員歡迎的編程語言,也是面向對象的一款設計語言,Python以其語言的靈活和簡易性,具有非常簡捷而清晰的語法特點,在腳本工具、數據分析、web后端等等領域都有著優良的表現,收到了大家的廣泛應用…

linux系統proc目錄,快速了解Linux系統下的proc目錄

/proc/devices文件這個文件列出字符和塊設備的主設備號,以及分配到這些設備號的設備名稱。常用的命令為#cat /proc/devices(在調試驅動的時候這個還是有用的,可以通過lsmod查看驅動模塊是否加載)/proc/interrupts這個文件的每一行都有一個保留的中斷。每…