一,PHP緩存機制詳解
我們可以使用PHP自帶的緩存機制來完成頁面靜態化,但是僅靠PHP自身的緩存機制並不能完美的解決頁面靜態化,往往需要和其他靜態化技術(通常是偽靜態技術)結合使用。
output buffer是php自帶緩存,可以通過配置php.ini關閉,程序緩存是一直開啟狀態,沒法關閉。程序緩存中內容沒法修改,output buffer中內容可以修改,修改完成后全部發給程序緩存。
當我們設計一個通信協議時,“消息頭/消息體”的分割方式是很常用的,消息頭告訴對方這個消息是干什么的,消息體告訴對方 怎么干。HTTP傳輸的消息也是這樣規定的,每一個HTTP包都分為HTTP頭和HTTP體兩部分,后者是可選的,而前者是必須的。一個網頁對應一個消息,發送消息時候,一般來說,都是先消息頭部分,在消息頭部分指明了 消息體部分的長度,然后使用\r\n\r\n來表示消息頭部分結束,接下來是消息體部分。如果沒有定義消息頭,發送默認的消息頭。
由圖可知,瀏覽器向apache發送http請求后,apache根據httpd.conf文件,將請求轉發給php處理模塊,php處理模塊根據php.ini處理test2.php,如果php.ini關閉output buffer,那么php處理模塊將信息頭部和信息內容直接發送給程序緩存,如果php.ini開啟output buffer,那么php處理模塊將信息頭部和信息內容直接發送給Output buffer,Output buffer接收完后再發送給程序緩存。
通過以下實例學習消息與php緩存,配置php.ini。
(1)php.ini,output_buffering=off,關閉php緩存;
(2)display_errors = on,顯示錯誤;
(3)error_reporting=E_ALL & ~E_NOTICE,表示所有非NOTICE級別的錯誤日志都打印出來;
之后執行以下代碼。
<?php echo “aaa”; header(“content-type:text/html;charset=utf-8”); echo “hello”; ?>
這段程序報警告。PHP處理模塊一邊處理程序,一邊將處理結果發送到程序緩存,處理第1行,將默認消息頭以及aaa作為消息體一部分發送到程序緩存,執行第2行,再次發送消息頭,此時程序緩存中有消息頭了,且沒法修改,此時報警告。因此可以在程序中將output buffer開啟,
<?php ob_start(); echo “aaa”; header(“content-type:text/html;charset=utf-8”); echo “hello”; ?>
執行第1行開啟緩存,執行第2行,將默認消息頭以及aaa作為消息體一部分發送給output buffer,執行第3行,修改消息頭,執行第4行,將hello發送給output buffer,程序執行完后,output buffer將消息發送給程序緩存,程序緩存輸出。
二,下面是一些php自帶緩存指令:
ob_start() //開啟緩存
ob_clean() //清空緩存
ob_end_clean() //清空緩存,關閉緩存
ob_flush() //刷新緩存(將緩存現有內容輸出)
ob_end_flush() //刷新緩存,並關閉緩存
$contents = ob_get_contents() //獲得緩存內容
file_put_contents("d:/log.txt",$contents) //將緩存內容打印到文本
三,flush與ob_flush區別
flush()是輸出程序緩存指令;
ob_flush()是輸出自帶緩存指令;