《PHP學(xué)習(xí):淺談PHP中output_buffering》要點:
本文介紹了PHP學(xué)習(xí):淺談PHP中output_buffering,希望對您有用。如果有疑問,可以聯(lián)系我們。
PHP應(yīng)用一、我們要說一下php中的緩存大概有哪些!
PHP應(yīng)用在PHP中,我們可以粗略的將緩存分為客戶端緩存(Browser緩存),服務(wù)器端緩存(Server緩存).由于PHP是基于B/S架構(gòu)的,所以,我們可以理解為瀏覽器端的緩存,服務(wù)器端緩存.
在服務(wù)器端PHP自帶的緩存中,主要可以分為兩大類緩存!程序緩存和OB緩存!這也是我們學(xué)習(xí)服務(wù)器端緩存的主要內(nèi)容!
PHP應(yīng)用在PHP中緩存的輸出順序為:
打開了php輸出緩存: echo,print -> php output_buffering -> server buffering -> browser buffering -> browser display
PHP應(yīng)用未打開php輸出緩存: echo,print -> server buffering -> browser buffering -> browser display
PHP應(yīng)用瀏覽器的輸出緩存:IE為256Bytes, Chrome與FireFox為1000Bytes,只有輸出數(shù)據(jù)達到了這個長度或者腳本結(jié)束瀏覽器才會將數(shù)據(jù)輸出在頁面上.
PHP應(yīng)用二、服務(wù)器端的響應(yīng)流程
PHP應(yīng)用A、客戶端向服務(wù)器端發(fā)送哀求響應(yīng)!
B、Apache服務(wù)器加載了PHP模塊,開啟相應(yīng)的進程(或線程)運行相應(yīng)的PHP腳本頁面!
C、在沒有開啟OB緩存的情況下,運行的結(jié)果全部都會被放到程序緩存中,然后打包發(fā)送給瀏覽器!瀏覽器對頁面進行渲染,生成我們最后看到的WEB頁面!
D、在開啟了OB緩存的情況下,運行的結(jié)果會被分別放入到OB緩存和程序緩存中,當程序運行到最后一行的時候,就會將OB緩存中的數(shù)據(jù)刷回到程序緩存中,然后打包返回給瀏覽器!瀏覽器對頁面進行渲染,生成我們看到的WEB頁面!
PHP應(yīng)用三、OB緩存的常見用法!
PHP應(yīng)用a、output_buffering=4096,輸出較少的數(shù)據(jù)(少于一個buffer)
PHP應(yīng)用
for($i=0; $i<5; $i++){
echo $i.'<br>';
sleep(1);
}
PHP應(yīng)用運行結(jié)果:等所有腳本全部運行完成后,才輸出,因為數(shù)據(jù)未滿一個buffer的大小.
PHP應(yīng)用b、output_buffering=4096,輸出較少的數(shù)據(jù)(少于一個buffer),關(guān)閉output_buffering,修改php.ini的output_buffering=0
PHP應(yīng)用
echo str_repeat(" ",1024);//這里重復(fù)輸出一個空白
for($i=0; $i<5; $i++){
echo $i."<br/>";
flush();
sleep(1);
}
PHP應(yīng)用運行結(jié)果:因為禁用了OB,不需要比及腳本運行完畢就可以輸出,數(shù)據(jù)沒有在OB停留,可以看到斷斷續(xù)續(xù)間歇性輸出.echo ->browser buffering -> browser display
PHP應(yīng)用c、output_buffering=4096,輸出較大數(shù)據(jù)(大于一個buffer),不使用ob_start()
PHP應(yīng)用
for($i=0; $i<5; $i++){
echo file_get_contents('f.txt').$i.'<br/><br/><br/><br/>';
sleep(2);
}
PHP應(yīng)用運行結(jié)果:f.txt為一個大于4kb的文件,因為大于buffer默認值,buffer空間不夠用,每當滿一個buffer就會輸出,所以可以看到間歇性輸出.
PHP應(yīng)用d、output_buffering=4096,輸出較大數(shù)據(jù)(大于一個buffer),使用ob_start()
PHP應(yīng)用
ob_start();
for($i=0; $i<5; $i++){
echo file_get_contents('f.txt').$i.'<br/><br/><br/><br/>';
sleep(2);
}
PHP應(yīng)用運行結(jié)果:因為使用了ob_start(),會為buffer設(shè)置足夠大的空間,因此會保留到腳本執(zhí)行完畢后才會輸出.
PHP應(yīng)用e、output_buffering=On,使用ob_start()
PHP應(yīng)用
ob_start();
echo "abc-";
header("content-type:text/html;charset=utf-8");
echo "hello-";
ob_end_flush();
echo "aa-";
echo ob_get_contents();
PHP應(yīng)用運行結(jié)果:abc-hello-aa-abc-hello-aa-
PHP應(yīng)用f、output_buffering=Off,使用ob_start()
PHP應(yīng)用
ob_start();
echo "abc-";
header("content-type:text/html;charset=utf-8");
echo "hello-";
ob_end_flush();
echo "aa-";
echo ob_get_contents();
PHP應(yīng)用運行結(jié)果:abc-hello-aa-
PHP應(yīng)用輸出緩沖區(qū)是可堆疊的,這即意謂著,當有一個 ob_start() 是活躍的時, 你可以調(diào)用另一個 ob_start() . 只要確保又正確調(diào)用了 ob_end_flush() 恰當?shù)拇螖?shù)即可. 如果有多重輸出回調(diào)函數(shù)是活躍的,輸出內(nèi)容會一直按嵌套的順序依次通過它們而被過濾.
PHP應(yīng)用注意:PHP5.2中,OB默認是關(guān)閉的,5.3之后默認是開啟的;
PHP應(yīng)用常用辦法:
PHP應(yīng)用1.ob_start
激活output_buffering機制,一旦激活,腳本不再直接輸出到瀏覽器,而是暫時寫入php buffering區(qū)域.直到腳本運行完畢后,才發(fā)送.
PHP應(yīng)用2.ob_get_contents
獲取php buffering中的數(shù)據(jù),注意:要在ob_end_clean()前調(diào)用,否則只會得到空字符.
PHP應(yīng)用3.ob_end_flush 和 ob_end_clean
ob_end_flush 會輸出php buffering 中的數(shù)據(jù),但不會清空.
ob_end_clean 不會輸出,只會清空php buffering中的數(shù)據(jù).
PHP應(yīng)用4.ob_flush 、flush、ob_implicit_flush
ob_flush 會刷新php buffering 中的數(shù)據(jù)到程序緩存
PHP應(yīng)用flush 則會刷新程序緩存到瀏覽器緩存中
PHP應(yīng)用ob_implicit_flush 將打開或關(guān)閉絕對(隱式)刷送.絕對(隱式)刷送將導(dǎo)致在每次輸出調(diào)用后有一次刷送操作,以便不再必要對 flush() 的顯式調(diào)用
PHP應(yīng)用四、OB緩存的作用!
PHP應(yīng)用OB緩存在各個方面都有應(yīng)用,但是,本人知道的主要是在兩個方面!
a、當網(wǎng)站準備做網(wǎng)站靜態(tài)化的時候,選擇OB緩存是一個不錯的選擇!
PHP應(yīng)用b、辦理Warning: Cannot modify header information - headers already sent by的錯誤!
究其發(fā)生錯誤的原因:是因為響應(yīng)頭和相應(yīng)主體位置錯位導(dǎo)致的!正常情況下,服務(wù)器返回給瀏覽器的相應(yīng)內(nèi)容,應(yīng)該是:響應(yīng)頭+響應(yīng)主體!
PHP應(yīng)用但是,如果我們開啟了OB緩存,那么相應(yīng)頭信息(一般也便是header()函數(shù)進行設(shè)置的信息),會被放入到程序緩存中!
而其他的輸出內(nèi)容,如:echo print_r var_dump 等,都會先被放入OB緩存中!
等程序結(jié)束的時候,或者OB緩存關(guān)閉的實話,將OB緩存的內(nèi)容在放入程序緩存中!從而保證響應(yīng)頭信息,始終在響應(yīng)主體內(nèi)容之前!
PHP應(yīng)用以上所述便是本文的全部內(nèi)容了,希望大家能夠喜歡.
維易PHP培訓(xùn)學(xué)院每天發(fā)布《PHP學(xué)習(xí):淺談PHP中output_buffering》等實戰(zhàn)技能,PHP、MYSQL、LINUX、APP、JS,CSS全面培養(yǎng)人才。
轉(zhuǎn)載請注明本頁網(wǎng)址:
http://www.snjht.com/jiaocheng/9686.html