php中的缓,php中的缓存机制解释
php緩存的理解,先列出ob系列函數(shù)的作用:
ob_start('func') 開啟php緩存,回調(diào)函數(shù)是對緩存內(nèi)數(shù)據(jù)的處理函數(shù)
ob_gzhandler 作為 ob_start 的回調(diào)函數(shù),對數(shù)據(jù)進(jìn)行g(shù)z壓縮
ob_implicit_flush(true/false) ?打開或關(guān)閉apache緩存,打開apache緩存將直接將數(shù)據(jù)輸出給用戶瀏覽器,不必用buffer函數(shù)手動輸出
flush 將apache緩存區(qū)的數(shù)據(jù)發(fā)送出去TCP到用戶瀏覽器
ob_get_contents 獲取緩存內(nèi)容
ob_get_length 獲取緩存內(nèi)容長度
ob_get_level 返回緩存級別(每個ob_start將開啟一個重0編號的緩存區(qū))
array ob_get_status() 返回當(dāng)前緩存機(jī)制的一些信息
ob_list_handlers
void ? ?ob_flush ? ? ? ? ? ?送出當(dāng)前緩存區(qū)內(nèi)容到上一緩存區(qū)并保留當(dāng)前緩存區(qū)
void ? ?ob_end_flush ?送出當(dāng)前緩存區(qū)內(nèi)容到上一緩存區(qū)銷毀(關(guān)閉)當(dāng)前緩存區(qū)
string ob_get_flush ?送出當(dāng)前緩存區(qū)內(nèi)容到上一緩存區(qū)銷毀(關(guān)閉)當(dāng)前緩存區(qū) 并返回緩沖區(qū)內(nèi)容
void ? ?ob_clean ? ? ? ? ? ?清空當(dāng)前緩沖區(qū)內(nèi)容
void ? ?ob_end_clean ??清空當(dāng)前緩沖區(qū)內(nèi)容并銷毀(關(guān)閉)當(dāng)前緩存區(qū)
string ob_get_clean ? ?清空當(dāng)前緩沖區(qū)內(nèi)容并銷毀(關(guān)閉)當(dāng)前緩存區(qū) 并返回當(dāng)前緩存區(qū)內(nèi)容
緩存的整個機(jī)制如下圖所示:
ob系列函數(shù)針對的都是 php bufer這塊
在php buffer中,每一個ob_start都會在php buffer中開啟一塊內(nèi)存空間,并且支持多級嵌套,嵌套關(guān)系如圖
不嵌套的話 "php最終輸出緩存區(qū)"就是level0 ,嵌套級別的操作都是對上級緩存空間進(jìn)行的操作 (level0 的上級緩存是Apache Buffer)
flush 函數(shù)是對Apache Buffer進(jìn)行的操作,刷新Apache Buffer 發(fā)送數(shù)據(jù)走TCP到用戶瀏覽器
PHP Buffer :
在php.ini 中的選項 output_buffer 是控制php buffer的,當(dāng)output_buffer = On 或者 output_buffer = number(num>0) 默認(rèn)開啟緩存 ob_start不能控制php buffer
當(dāng) output_buffer=0 或者 output_buffer=Off 就是關(guān)閉緩存 在腳本中需要 通過 ob_start 函數(shù)開啟
output_buffer項不能通過 ini_set進(jìn)行修改
Apache Buffer:
在php.ini中的選項implicit_flush= On/Off 開啟的話,Apache Buffer中的數(shù)據(jù)不會緩存而是直接發(fā)送出去
ob_implicit_flush(true/ false) 可以對這個選項進(jìn)行設(shè)置
開啟Apache Buffer緩存后要想送出緩存中的數(shù)據(jù)需要用到函數(shù) flush
很多時候 ob_flush flush 要結(jié)合使用:
ob_flush PHP Buffer->Apache Buffer
flush ? ? ? Apache Buffer->Browser
ob_flush ob_end_flush ob_get_flush 都有送出緩存內(nèi)容的操作,這時的送出緩存都是送出到上一級別的緩存區(qū)域 最后一并輸出給Apache Buffer
關(guān)于PHP Buffer中的多級緩存:
每個ob_start 函數(shù)都會在PHP Buffer中開啟一個緩存區(qū)域,php會將這些區(qū)域進(jìn)行編號(從0開始),可以通過 ob_get_level函數(shù)獲取編號
緩存嵌套的整個操作是將整個緩存進(jìn)行合并最后一并發(fā)送給Apache Buffer
ob_flush函數(shù)是將當(dāng)前編號內(nèi)的內(nèi)容送到上一編號并將php buffer中的內(nèi)容發(fā)送到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().'
';
輸出內(nèi)容:
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();
結(jié)果:
buffer1
buffer2
不出所料,先將 2 級別緩存的內(nèi)容clean掉,1 ,0 級別的內(nèi)容正常輸出
例子三:
ob_start();
echo "buffer1
";
ob_start();
echo "buffer2
";
ob_start();
echo "buffer3
";
ob_end_flush();
ob_end_clean();
ob_end_flush();
結(jié)果:
buffer1
從上面的例子可以總結(jié)下php緩存機(jī)制中嵌套中 整合輸出的過程如下
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 緩存結(jié)構(gòu)?1:"buffer2buffer3"---->0:"buffer1"
第二次?ob_end_flush 緩存結(jié)構(gòu) 0:"buffer1buffer2buffer3"
第三次?ob_end_flush 緩存結(jié)構(gòu) 發(fā)送內(nèi)容到Apache Buffer
結(jié)果:buffer1buffer2buffer3
如例子二中
ob_end_clean?緩存結(jié)構(gòu)?1:"buffer2"---->0:"buffer1"
ob_end_flush?緩存結(jié)構(gòu) 0:"buffer1buffer2"
ob_end_flush 緩存結(jié)構(gòu) 發(fā)送內(nèi)容到Apache Buffer
結(jié)果:buffer1buffer2
如例子三中
ob_end_flush 緩存結(jié)構(gòu)?1:"buffer2buffer3"---->0:"buffer1"
ob_end_clean?緩存結(jié)構(gòu) 0:"buffer1"
ob_end_flush 緩存結(jié)構(gòu) 發(fā)送內(nèi)容到Apache Buffer
結(jié)果:buffer1
以上清楚的解釋了php中的緩存機(jī)制
理解了整個機(jī)制,函數(shù)的使用就簡單了 Good Luck
總結(jié)
以上是生活随笔為你收集整理的php中的缓,php中的缓存机制解释的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 包编译安装mysql_Ce
- 下一篇: 家里甲醛超标,可以用初态石和初态石一起治