国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 網站 > 建站經驗 > 正文

淺談PHP中output_buffering

2024-04-25 20:39:01
字體:
來源:轉載
供稿:網友

一、我們要說一下php中的緩存大概有哪些!

在PHP中,我們可以粗略的將緩存分為客戶端緩存(Browser緩存),服務器端緩存(Server緩存)。由于PHP是基于B/S架構的,所以,我們可以理解為瀏覽器端的緩存,服務器端緩存。

在服務器端PHP自帶的緩存中,主要可以分為兩大類緩存!程序緩存和OB緩存!這也是我們學習服務器端緩存的主要內容!

在PHP中緩存的輸出順序為:

打開了php輸出緩存: echo,print -> php output_buffering -> server buffering -> browser buffering -> browser display

未打開php輸出緩存: echo,print -> server buffering -> browser buffering -> browser display

瀏覽器的輸出緩存:IE為256Bytes, Chrome與FireFox為1000Bytes,只有輸出數據達到了這個長度或者腳本結束瀏覽器才會將數據輸出在頁面上。

二、服務器端的響應流程

A、客戶端向服務器端發送請求響應!

B、Apache服務器加載了PHP模塊,開啟相應的進程(或線程)運行相應的PHP腳本頁面!

C、在沒有開啟OB緩存的情況下,運行的結果全部都會被放到程序緩存中,然后打包發送給瀏覽器!瀏覽器對頁面進行渲染,生成我們最后看到的WEB頁面!

D、在開啟了OB緩存的情況下,運行的結果會被分別放入到OB緩存和程序緩存中,當程序運行到最后一行的時候,就會將OB緩存中的數據刷回到程序緩存中,然后打包返回給瀏覽器!瀏覽器對頁面進行渲染,生成我們看到的WEB頁面!

三、OB緩存的常見用法!

a、output_buffering=4096,輸出較少的數據(少于一個buffer)

for($i=0; $i<5; $i++){

echo $i.'<br>';

sleep(1);

}

運行結果:等所有腳本全部運行完成后,才輸出,因為數據未滿一個buffer的大小。

b、output_buffering=4096,輸出較少的數據(少于一個buffer),關閉output_buffering,修改php.ini的output_buffering=0

echo str_repeat(" ",1024);//這里重復輸出一個空白

for($i=0; $i<5; $i++){

echo $i."<br/>";

flush();

sleep(1);

}

運行結果:因為禁用了OB,不需要等到腳本運行完畢就可以輸出,數據沒有在OB停留,可以看到斷斷續續間歇性輸出。echo ->browser buffering -> browser display

c、output_buffering=4096,輸出較大數據(大于一個buffer),不使用ob_start()

for($i=0; $i<5; $i++){

echo file_get_contents('f.txt').$i.'<br/><br/><br/><br/>';

sleep(2);

}

運行結果:f.txt為一個大于4kb的文件,因為大于buffer默認值,buffer空間不夠用,每當滿一個buffer就會輸出,所以可以看到間歇性輸出。

d、output_buffering=4096,輸出較大數據(大于一個buffer),使用ob_start()

ob_start();

for($i=0; $i<5; $i++){

echo file_get_contents('f.txt').$i.'<br/><br/><br/><br/>';

sleep(2);

}

運行結果:因為使用了ob_start(),會為buffer設置足夠大的空間,因此會保存到腳本執行完畢后才會輸出。

e、output_buffering=On,使用ob_start()

ob_start();

echo "abc-";

header("content-type:text/html;charset=utf-8");

echo "hello-";

ob_end_flush();

echo "aa-";

echo ob_get_contents();

運行結果:abc-hello-aa-abc-hello-aa-

f、output_buffering=Off,使用ob_start()

ob_start();

echo "abc-";

header("content-type:text/html;charset=utf-8");

echo "hello-";

ob_end_flush();

echo "aa-";

echo ob_get_contents();

運行結果:abc-hello-aa-

輸出緩沖區是可堆疊的,這即意謂著,當有一個 ob_start() 是活躍的時, 你可以調用另一個 ob_start() 。 只要確保又正確調用了 ob_end_flush() 恰當的次數即可。 如果有多重輸出回調函數是活躍的,輸出內容會一直按嵌套的順序依次通過它們而被過濾。

注意:PHP5.2中,OB默認是關閉的,5.3之后默認是開啟的;

常用方法:

1.ob_start

激活output_buffering機制,一旦激活,腳本不再直接輸出到瀏覽器,而是暫時寫入php buffering區域。直到腳本運行完畢后,才發送。

2.ob_get_contents

獲取php buffering中的數據,注意:要在ob_end_clean()前調用,否則只會得到空字符。

3.ob_end_flush 和 ob_end_clean

ob_end_flush 會輸出php buffering 中的數據,但不會清空。

ob_end_clean 不會輸出,只會清空php buffering中的數據。

4.ob_flush 、flush、ob_implicit_flush

ob_flush 會刷新php buffering 中的數據到程序緩存

flush 則會刷新程序緩存到瀏覽器緩存中

ob_implicit_flush 將打開或關閉絕對(隱式)刷送。絕對(隱式)刷送將導致在每次輸出調用后有一次刷送操作,以便不再需要對 flush() 的顯式調用

四、OB緩存的作用!

OB緩存在各個方面都有應用,但是,本人知道的主要是在兩個方面!

a、當網站準備做網站靜態化的時候,選擇OB緩存是一個不錯的選擇!

b、解決Warning: Cannot modify header information - headers already sent by的錯誤!

究其發生錯誤的原因:是因為響應頭和相應主體位置錯位導致的!正常情況下,服務器返回給瀏覽器的相應內容,應該是:響應頭+響應主體!

但是,如果我們開啟了OB緩存,那么相應頭信息(一般也就是header()函數進行設置的信息),會被放入到程序緩存中!

而其他的輸出內容,如:echo print_r var_dump 等,都會先被放入OB緩存中!

等程序結束的時候,或者OB緩存關閉的實話,將OB緩存的內容在放入程序緩存中!從而保證響應頭信息,始終在響應主體內容之前!

以上所述就是本文的全部內容了,希望大家能夠喜歡。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 丰台区| 贵港市| 天全县| 南岸区| 惠东县| 淮阳县| 石棉县| 资溪县| 湘西| 天峨县| 新乡市| 毕节市| 弥勒县| 浪卡子县| 富裕县| 抚顺县| 读书| 东乌珠穆沁旗| 清远市| 左权县| 越西县| 新安县| 屏东市| 东平县| 尼玛县| 连江县| 临西县| 松原市| 富裕县| 河东区| 磴口县| 桦川县| 公主岭市| 信丰县| 黑龙江省| 仲巴县| 根河市| 大同县| 寿光市| 高要市| 渝中区|