PHP實現頁面緩存處理(生成靜態頁面)(轉)

PHP實現頁面緩存處理(生成靜態頁面)

1.功能實現頁面緩存 

a.       自動生成緩存文件夾且能保存緩存文件 

b.       清除緩存文件 

c.       根據頁面文件動態生成緩存文件名 

d.       記錄緩存文件建立時間 

e.       讀取緩存 

2.處理輸出緩衝的相關資函數介紹: 

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

ob_get_contents() 這個函數返回內部緩衝的內容. 這就等於把這些輸出都變成了字符串. 

ob_get_ length() 返回內部緩衝的長度. 

ob_end_flush() 結束輸出緩衝, 並輸出緩衝里的內容. 在這以後的輸出都是正常輸出. 

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

3、調用:在要對其進行緩存處理的php頁面最頂部載入auto_cache.php文件即可。

<?php  
require('auto_cache.php');  
?>  

緩存處理文件auto_cache.php代碼如下:

<?php 
/* 
【PHP實現頁面緩存處理】 
auto_cache.php 實現智能的自動緩存。 
在需要實現緩存功能的頁面 require('auto_cache.php');即可;
存放緩存的根目錄,最好是放到/tmp目錄,尤其是虛擬主機用戶,因為/tmp目錄不佔自己的主頁空間啊 
 
ob_start() 開始輸出緩衝, 這時PHP停止輸出, 在這以後的輸出都被轉到一個內部的緩衝里.  
ob_get_contents() 這個函數返回內部緩衝的內容. 這就等於把這些輸出都變成了字符串.  
ob_get_ length() 返回內部緩衝的長度.  
ob_end_flush() 結束輸出緩衝, 並輸出緩衝里的內容. 在這以後的輸出都是正常輸出.  
ob_end_clean() 結束輸出緩衝, 並扔掉緩衝里的內容. 
*/ 
 
define('CACHE_ROOT', dirname(__FILE__).'/cache'); 
define('CACHE_LIFE', 3600);                   //緩存文件的生命期,單位秒,86400秒是一天 
define('CACHE_SUFFIX','.html');             //緩存文件的擴展名,千萬別用 .php .asp .jsp .pl 等等 
 
$file_name  = md5($_SERVER['REQUEST_URI']).CACHE_SUFFIX;    //緩存文件名 
 
//緩存目錄,根據md5的前兩位把緩存文件分散開。避免文件過多。如果有必要,可以用第三四位為名,再加一層目錄。 
//256個目錄每個目錄1000個文件的話,就是25萬個頁面。兩層目錄的話就是65536*1000=六千五百萬。 
//不要讓單個目錄多於1000,以免影響性能。 
 
$cache_dir  = CACHE_ROOT.'/'.substr($file_name,0,2); 
$cache_file = $cache_dir.'/'.$file_name;    //緩存文件存放路徑 
 
if($_SERVER['REQUEST_METHOD']=='GET'){      //GET方式請求才緩存,POST之後一般都希望看到最新的結果 
    if(file_exists($cache_file) && time() - filemtime($cache_file) < CACHE_LIFE){   //如果緩存文件存在,並且沒有過期,就把它讀出來。 
        $fp = fopen($cache_file,'rb'); 
        fpassthru($fp); 
        fclose($fp); 
        exit(); 
    } 
    elseif(!file_exists($cache_dir)){ 
        if(!file_exists(CACHE_ROOT)){ 
            mkdir(CACHE_ROOT,0777); 
            chmod(CACHE_ROOT,0777); 
        } 
        mkdir($cache_dir,0777); 
        chmod($cache_dir,0777); 
    } 
 
    function auto_cache($contents){         //回調函數,當程序結束時自動調用此函數 
        global $cache_file; 
        $fp = fopen($cache_file,'wb'); 
        fwrite($fp,$contents); 
        fclose($fp); 
        chmod($cache_file,0777); 
        clean_old_cache();                  //生成新緩存的同時,自動刪除所有的老緩存。以節約空間。 
        return $contents; 
    } 
 
    function clean_old_cache(){ 
        chdir(CACHE_ROOT); 
        foreach (glob("*/*".CACHE_SUFFIX) as $file){ 
           if(time()-filemtime($file)>CACHE_LIFE){ 
               unlink($file); 
           } 
        } 
    } 
     
    ob_start('auto_cache');                 //回調函數 auto_cache 
} 
else{ 
    if(file_exists($cache_file)){           //file_exists() 函數檢查文件或目錄是否存在。 
        unlink($cache_file);                //不是GET的請求就刪除緩存文件。 
    } 
} 
?>  

注意:先要將需要處理的php文件中的圖片、文件下載、文字超鏈接等[鏈接]要改成絕對路徑(因為緩存文件是放置在你所生成的緩存文件夾中)。除非你自己設置不生成緩存文件夾,直接生成緩存文件與php文件在同一目錄下。

如:

<img src="p_w_picpaths/aa.jpg" />

要改成:

<img src="http://www.xxx.com/p_w_picpaths/aa.jpg" />

本文轉自:https://blog.51cto.com/xuqin/1194054

到此為止。

發布者:彬彬筆記,轉載請註明出處:https://www.binbinbiji.com/zh-hant/php/2742.html

(0)
彬彬筆記彬彬筆記
上一篇 2022年7月26日
下一篇 2022年7月26日

相關推薦

發表回復

您的電子郵箱地址不會被公開。 必填項已用 * 標註

蜀ICP備14017386號-13