一、什么是動態語言靜態化
將現有PHP等動態語言的邏輯代碼生成為靜態html文件,用戶訪問動態腳本重定向到靜態html的過程
注 : 對實時性要求不高的頁面才適合去做動態語言靜態化
?
二、為什么要靜態化
1. 動態腳本通常會做邏輯計算和數據查詢,訪問量越大,服務器壓力越大
2. 訪問量大時可能會造成CPU負載過高,數據庫服務器壓力過大
3. ?靜態化可以降低邏輯處理壓力,降低數據庫服務器查詢壓力
?
三、靜態化的實現方式
第一種:使用模板引擎
( 1 ) 可以使用smarty的緩存機制生成靜態html緩存文件
$smarty->cache_dir = $ROOT."/cache"; //緩存目錄
$smarty->caching = true;//是否開啟緩存
$smarty->cache_lifetime = '3600';//緩存時間
$smarty->display(string template [, string cache_id [,string compile_id]]);
備注:cache_id 緩存id; ?compile_id 編譯文件id
(2) ?清除smarty緩存
$smarty->clear_all_cache();//清除所有緩存
$smarty->clear_cache('file.html'); //清除指定的緩存
$smarty->clear_cache('article.html',$art_id); //清除該模板下的指定緩存號的緩存
?
第二種: 利用ob系列的函數做靜態化緩存 (推薦)
(1) 相關函數
ob_start();//打開輸出控制緩沖
ob_get_contents();//返回輸出緩沖區內容
ob_clean();//清空輸出緩沖區
ob_end_flush();//沖刷出(送出)輸出緩沖區內容并關閉緩沖
(2) 示例:
<?php
$cache_name = md5(__FILE__).'.html';//定義之后生成緩存文件的文件名$cache_lifetime = 3600;//定義過期時間為1小時//限制條件,條件符合,就加載緩存文件
if(filemtime(__FILE__) <= filemtime($cache_name) && file_exists($cache_name) && filectime($cache_name) + $cache_lifetime > time())
{include $cache_name;//如果在緩存之后沒有進行過修改,并且文件存在,并且沒有過期,我們就加載文件,并且下面內容不再訪問var_dump(filemtime());//測試時用的,看修改文件時,是否還能夠讀取緩存文件exit;
}ob_start(); //開啟緩存?>=========這部分是我們要緩存的內容========<?php$content = ob_get_contents(); //獲取緩存區的內容ob_end_flush();//關閉緩存區$handle = fopen($cache_name,'w');//將文件以寫的方式打開fwrite($handle,$content);//將我們獲取到的緩存內容$content寫入我們定義好的緩存文件fclose($handle); //關閉打開的文件資源?>
?
現在訪問瀏覽器
與此同時,還生成了一個緩存文件,內容和從php文件中獲取到的是一樣的
現在,我們沒有修改文件,再刷新瀏覽器,會出現我們在if語句中輸出的filemtime,這證明if滿足,已經在讀取緩存文件了
現在,我們再修改一下文件,在文字后面加了一個+,如果瀏覽器顯示這個+,并且不輸出文件的修改時間,就證明讀取的不是緩存文件
瀏覽器顯示:
瀏覽器顯示結果帶 + , 證明文件修改之后,就重新讀取文件,然后再刷新
結果證明: 因為文件沒有再被修改,所以又讀取緩存文件了
?
?
代碼源碼下載:?http://download.csdn.net/download/m_nanle_xiaobudiu/10242029