首頁  >  文章  >  後端開發  >  PHP 快取機制

PHP 快取機制

巴扎黑
巴扎黑原創
2016-11-23 10:19:562434瀏覽

在寫PHP程式的時候常常遇到這個問題;

包含使用header()函數,使用session()函數、cookies函數都有可能出次問題

PHP程式報如下錯誤:

Cannot modify header information - headers already sent by (output started at

不能夠修改header infomation ,要解決這個錯誤需要明白兩點問題。

第一,http協議

在http協議中,伺服器向瀏覽器端輸出html文件, html檔案由兩部分組成,一部分是我們頁面本身的數據,還有一部分就是html頁面的頭信息,這些信息包含很多數據,如頁面以何種編碼格式顯示、html數據大小、是否跳轉、是否緩存等等。緩存,一是程式緩存,我理解為程式在記憶體中的資料緩存;二是PHP提供的快取模組,透過這個模組,PHP會另外在開闢一塊地方作為資料的緩存,如果PHP模組快取開啟,則當程式中有echo資料的時候,資料被放入快取中,而不是直接產生HTML文件,直到PHP程式運行完畢,再把模組快取的資料一併產生HTML程式碼,包含頭檔。

1.快取未開啟(預設是這樣的)

<?php
echo "123";
header("Content-type:text/html;charset=utf-8")
echo "456";
?>

這時候曝出Cannot modify header information 錯誤;

 

2. 開啟快取機制reee在上述兩個例子中,未開啟快取狀態,未開啟快取機制

在上述兩個例子中,未開啟快取狀態,未開啟快取狀態當echo "123"; 的時候已經產生一份HTML程式碼, 到第三行的時候header函數就不能修改頭文件信息,報錯; 在例子2中ob_start() ; 開啟緩存,(ob是output_buffer),當echo "123" 時候資料寫入到快取模組中, 然後header()函數運行,此時並未產生HTML頁面,然後echo "456";也是輸出到快取模組,當程式執行完畢後,快取模組的數據再產生完整的HTML頁面,這樣就不報錯了。的,如果必要的話,可以修改php.ini文件,找到output_buffering 選項,修改為output_buffering = 4096  (On也行),數字代表快取大小。

PHP快取機制還有一些函數,大家可是試試,能更好的理解PHP快取機制

ob_start() 開始輸出緩衝, 這時PHP停止輸出, 在這以後的輸出都被轉到一個內部的緩衝裡. 

ob_g​​et_contents() 這個函數回傳內部緩衝的內容. 這等於把這些輸出都變成了字串. 

ob_g​​et_ length() 傳回內部緩衝的長度. 

ob_g​​et_ length() 返回內部緩衝的長度. 並且輸出緩衝裡的內容. 在這以後的輸出都是正常輸出. 

ob_end_clean() 結束輸出緩衝, 並扔掉緩衝裡的內容.




陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn