php的ob函式實現頁面靜態化

OldBoy~發表於2017-05-17

首先介紹一下php中ob快取常用到的幾個常用函式
ob_start():開啟快取機制
ob_get_contents():獲取ob快取中的內容
ob_clean()清除ob快取中的內容,但不關閉快取
ob_end_clean() 清除ob快取中的內容,並關閉快取
ob_flush 清空快取,輸出內容,但不關閉快取
ob_end_flush 清空快取,輸出內容,並關閉快取
flush強制重新整理輸出快取中的內容
按照http協議的規定,迴應內容不能在迴應頭之前輸出,所以,如果在header()函式前面有內容輸出,就會出現錯誤,但使用了ob_start()後就會將回應內容先放在ob快取中,不會再訊息頭髮送之前被髮送,就解決了header()報錯的問題!

簡單的案例:

<?php

$id = $_GET['id'];
$cache_name = md5(__FILE__) . '-' . $id .'.html';  //⑤生成快取檔案的名稱
$cache_lifetime = 3600;                    //⑩設定一個過期時間3600秒
//⑨訪問的時候,先判斷是否有靜態檔案,是否沒有被修改,沒有過期,檔案的修改時間如果小於等於快取的修改時間,那麼直接訪問快取檔案
if (filectime(__FILE__) <= filectime($cache_name) && (file_exists($cache_name) + $cache_lifetime) > time()) {
    //判斷是走了快取  
    include $cache_name;
    exit;
}
ob_start();  //①開啟緩衝區
?>
/*②內容邏輯,這裡只是簡單的一行程式碼,有可能是複雜的查詢之類的*/
<h1>Test Content  id = <?php echo $id; ?></h1>  

<?php
$content = ob_get_contents();   //③拿到緩衝區內容
ob_end_flush();                 //④拿到之後關閉緩衝區
$handle = fopen($cache_name, 'w');  //⑥寫入內容,以寫的方式開啟
fwrite($handle, $content);    //⑦往裡面寫內容
fclose($handle);                  //⑧關閉
?

 

相關文章