首頁 >php教程 >PHP开发 >談PHP生成靜態頁面分析 範本+快取+寫文件

談PHP生成靜態頁面分析 範本+快取+寫文件

黄舟
黄舟原創
2016-12-14 13:24:341302瀏覽

一、引言 
在速度上,靜態頁面要比動態頁面的比方php快很多,這是毫無疑問的,但是由於靜態頁面的靈活性較差,如果不借助數據庫或其他的設備保存相關信息的話,整體的管理上比較繁瑣,比方修改編輯.比方閱讀權限限制等,但是,對應一些我們經常頻頻使用的文件,比方說,開發的新聞發布系統,我們不希望很多用戶都讀取數據庫才顯示結果,這樣一方面消耗了伺服器的資源,另一方面佔去了瀏覽者大量可貴的回應時間,所有,有了"靜態頁面話"的做法,當前很多網站都採用這種技術,一般都是由管理後台控制,或者產生html直接顯示,或者xhtml用css控制顯示,或者產生xml用xslt顯示,這些技術都不是難的,在這裡我就淺顯的說說生成html的方法. 
二、預備知識 
模板技術: 
[PHP] 模板引擎Smarty深入淺出介紹--2005-12-31 
[PHP] 笑談配置,使用Smarty技術--2006-01-04 
緩存技術: 
有些資訊比方經常不變的,但是還是經常不變的資訊比方經常不變的資訊。能變的資訊放在快取中以加快顯示速度,這是很有價值的,所謂的快取,通俗的理解就是一些保存在伺服器端的共用資訊.它是於伺服器同生死的,我們在保存快取的時候可以指定下次更新的時間的判斷,比方要在5分鐘更新一次,可以記錄上次更新的時間,和當前時間比較,如果大於5 分鐘,讀取數據庫,更新換成,否則直接讀取緩存數據,當然,快取需要客戶端使用者啟動的,只需一次. 
ob_start()函數:開啟輸出緩衝區. 
函數格式void ob_start(void) 
說明:當緩衝區啟動時,所有來自PHP程式的非文件頭資訊均不會傳送,而是保存在內部緩衝區。為了輸出緩衝區的內容,可以使用ob_end_flush()或flush()輸出緩衝區的內容。 
Flush:刷新緩衝區的內容,輸出。 
函數格式:flush() 
說明:這個函數常用,效率很高。 
ob_g​​et_contents :傳回內部緩衝區的內容。 
函數格式:string ob_get_contents(void) 
說明:這個函數會傳回目前緩衝區的內容,如果輸出緩衝區沒有啟動,則回傳 FALSE. 
ob_g​​et_length:傳回內部緩衝區的長度。
函數格式:int ob_get_length(void) 
說明:這個函數會返回當前緩衝區中的長度;和ob_get_contents一樣,如果輸出緩衝區沒有激活,則返回FALSE. 
ob_end_clean:刪除內部緩衝區的內容,並且關閉內部緩衝區 
函數格式:void ob_end_clean(void) 
說明:這個函數不會輸出內部緩衝區的內容而是把它刪除 
ob_end_flush:傳送內部緩衝區的內容到瀏覽器,並且關閉輸出緩衝區 
函數格式:void ob_end_flush(void) 
說明:此函數傳送輸出緩衝區的內容(如果有的話) 
ob_implicit_flush:開啟或關閉絕對刷新 
函數格式:void ob_implicit_flush ([int flag])))緩衝區,開啟絕對輸出後,每個腳本輸出都直接傳送到瀏覽器,不再需要呼叫flush() 
檔案寫入: 
int fwrite ( resource handle, string string [, int length] ) 
fwrite()把string 的內容寫入檔案指標handle 處。 如果指定了 length,當寫入了 length 個位元組或寫完了 string 以後,寫入就會停止,視乎先碰到哪種情況。 
fwrite() 傳回寫入的字元數,出現錯誤時則回傳 FALSE 。
相關參考官方網站: 文件參考 
三、解決方案 
思路:開啟ob_start緩衝,當已經調出數據的時候獲取ob_get_contents,然後生成靜態頁,ob_end_clean清除緩衝.ok,就這麼來,來看一個例子( php+mysql的結合): 
建立資料庫:

複製程式碼如下:

Create TABLE `bihtml` ( 
`id` int(11) NOT NULL auto_increment, 
`szdtitle` char szdcontent` text NOT NULL, 
PRIMARY KEY (`id`) 
) TYPE

取得目前的ID,並匯入範本:

複製程式碼如下:
ob_start(); 
$id=_POST['id'] 
if(!isset($id)&is_integer($id)) 
{ ,
@$db=new mysqli('local',
@$db=new mysqli('local',
@$db=new mysqli('local',
@$db=new mysqli('local',
@$db=new mysqli('local',
@$db=new mysqli('local', 'root','admin','bihtml'); 
$result=$db->fetch_one_array("select * from szd_bi where id='$id'"); 
if(!emptyempty($result)) 
{
$tmp->assign(array( 
"Szdtitle",htmlspecialchars($result['titles']), 
"Szdcontent",$result['titles'])); 

} default_1.tpl'); 
$this_my_f= ob_get_contents(); //此處關鍵 
ob_end_clean(); 
$filename = "$id.html"; 
if(tohtml_cjjer($filename,$id.html"; 

if(tohtml_cjjer($file,$id.生成成功$filename"; 

else 
echo "生成識別"; 

}

//把生成文件的過程寫出函數 
function tohtmlfile_cjjer($file_cjjer_name,$file_cjjer_content) 

if (is_file ($file_cjjer_name )){ 
@unlink ($file_cjjer_name); 

$cjjer_handle = fopen ($file_cjjer_name,"w"); 
if (!is_writable ($is_cjjer_name)){ fac
$cjjer_handle,$file_cjjer_content)){ 
return false; 

fclose ($cjjer_handle); //關閉指針 

return $file_cjjer_name; 
}就加入資料列產生靜態頁面,可以考慮記錄產生的檔案名稱次和路徑. 
2: php主要是ob_starts()和ob_get_contents,產生靜態頁面的時候很有用,當然也可以考慮調出資料庫直接替換模板裡面的變數也是可以的. 
3: 主要的模板使用smarty,phplib都是可以的,smarty使用比較簡易.

希望以上文章內容可以幫助到大家,更多相關文章請關注PHP中文網(www.php.cn)!

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