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 ? ?清空當前緩沖區內容并銷毀(關閉)當前緩存區 并返回當前緩存區內容
緩存的整個機制如下圖所示:
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