在php5.2版本的配置中,預設output_buffering為關閉狀態,因此執行下面三行**將會出現乙個警告:
warning: cannot modify header information - headers already sent
tozospdecho 'hello1';
header('content-type:text/html;charset=utf-8');
echo 'hello2';
開啟ob快取的方式有如下兩種:
1. php.ini中開啟 output_buffering = 4096
啟用了此指令,那麼每個php指令碼都相當於一開始就呼叫了ob_start()函式,php5.5預設已開啟output_buffering = 4096
2. 直接在程式中使用 ob_start();
開啟輸出緩衝。當輸出緩衝啟用後,指令碼將不會輸出內容(除h程式設計客棧ttp標頭外),相反需要輸出的內容被儲存在內部緩衝區中。
內部緩衝區的內容可以用 ob_get_contents() 函式複製到乙個字串變數中。 想要輸出儲存在內部緩衝區中的內容,可以使用 ob_end_flush() 函式。另外, 使用 ob_end_clean() 函式會靜默丟棄掉緩衝區的內程式設計客棧容。
/*** output_buffering = off 情況下測試
*/ob_start(); /www.cppcns.com/開啟ob快取
echo 'hello1'; //存入ob快取
header('content-type:text/html;charset=utf-8');//存入程式快取
//ob_end_clean(); //清空ob快取,並關閉ob快取
echo 'hello2'; //存入ob快取
$str = ob_get_contents(); //返回ob快取的資料(不清除緩衝內容)
file_put_contents('ob.txt', $str); //把$str儲存到檔案
//ob_clean(); //清空ob快取
echo 'hello3'; //存入ob快取
echo 'hello4'; //存入ob快取
/* 此指令碼將生成ob.txt檔案,存入hello1hello2,瀏覽器輸出hello1 */
/* 若ob_clean()注釋開啟,那麼生成的ob.txt檔案中將沒有內容,瀏覽器輸出hello3hello4 */
/* 若ob_end_clean()注釋開啟,那麼ob.txt中依然沒有內容,因為關閉了ob快取,瀏覽器輸出hello2hello3hello4 */
ob_flush() 與 ob_end_flush() 例子:
ob_start();
echo 'abc';//存入ob快取
header('content-type:text/html;charset=utf-8'); //存入程式快取
echo 'hello'; //存入ob快取
ob_flush();//將ob快取中的內容輸出到程式快取,清空ob快取,不關閉ob快取
//ob_end_flush() //將ob快取中的內容輸出到程式快取,清空ob快取,關閉ob快取
echo 'aa'; //存入ob快取
echo ob_get_contents();
/* 最後輸出abchelloaaaa */
/* 注釋ob_flush,開啟ob_end_flush,最後輸出abchelloaa */
注意:在output_buffering = 4096開啟的情況下,ob_end_clean()只關閉一次ob快取(即ob_start開啟的),系統的並未關閉。
ob_end_flush()同理。
ob快取的執行原理/原則:
1. ob快取開啟,echo的資料首先放入ob快取
2. 如果是header資訊,直接放在程式快取
3. 當頁面執行到最後,會把ob快取的資料放到程式快取,然後一次返回給瀏覽器
最後還有乙個flush(); 強制重新整理php程式快取到瀏覽器快取。
特性:一些版本的 microsoft internet explorer 只有當接受到的256個位元組以後才開始顯示該頁面,所以必須傳送一些額外的空格來讓這些瀏覽器顯示頁面內容。
echo str_repeat('', 1024);//重複輸出多個字元(解決瀏覽器快取256位元組之後再輸出的情況)
for($i=0; $i < 5; $i++)
本文標題: php快取機制output control詳解
本文位址:
PHP快取機制
普遍快取技術 資料快取 這裡所說的資料快取是指資料庫查詢php快取機制,每次訪問頁面的時候,都會先檢測相應的快取資料是否存在,如果不存在,就連線資料庫,得到資料,並把查詢結果序列化後儲存到檔案中,以後同樣的查詢結果就直接從快取表或檔案中獲得。用的最廣的例子看discuz的搜尋功能,把結果id快取到乙...
php快取機制
資料快取 這裡所說的資料快取是指資料庫查詢快取,每次訪問頁面的時候,都會先檢測相應的快取資料是否存在,如果不存在,就連線資料庫,得到資料,並把查詢結果序列化後儲存到檔案中,以後同樣的查詢結果就直接從快取表或檔案中獲得。用的最廣的例子看discuz的搜尋功能,把結果id快取到乙個表中,下次搜尋相同關鍵...
php快取機制
普遍快取技術 資料快取 這裡所說的資料快取是指資料庫查詢快取,每次訪問頁面的時候,都會先檢測相應的快取資料是否存在,如果不存在,就連線資料庫,得到資料,並把查詢結果序列化後儲存到檔案中,以後同樣的查詢結果就直接從快取表或檔案中獲得。用的最廣的例子看discuz的搜尋功能,把結果id快取到乙個表中,下...