一、引 言
在速度上,靜態(tài)頁面要比動態(tài)頁面的比方php快很多,這是毫無疑問的,但是由于靜態(tài)頁面的靈活性較差,如果不借助數據庫或其他的設備保存相關信息的話,整體的管理上比較繁瑣,比方修改編輯.比方閱讀權限限制等,但是,對應一些我們經常頻頻使用的文件,比方說,開發(fā)的新聞發(fā)布系統(tǒng),我們不希望很多用戶都讀取數據庫才顯示結果,這樣一方面消耗了服務器的資源,另一方面占去了瀏覽者大量可貴的響應時間,所有,有了"靜態(tài)頁面話"的做法,當前很多網站都采用這種技術,一般都是由管理后臺控制,或者生成html直接顯示,或者xhtml用css控制顯示,或者生成xml用xslt顯示,這些技術都不是難的,在這里我就淺顯的說說生成html的方法.
二、預備知識
模板技術:
[PHP] 模板引擎Smarty深入淺出介紹 --2005-12-31 [PHP] 笑談配置,使用Smarty技術 --2006-01-04
緩存技術:
有些信息比方經常不變的,但是還是能變的信息放在緩存中以加快顯示速度,這是很有價值的,所謂的緩存,通俗的理解就是一些保存在服務器端的共用信息.它是于服務器同生死的,我們在保存緩存的時候可以指定下次更新的時間的判斷,比方要在5分鐘更新一次,可以記錄上次更新的時間,和當前時間比較,如果大于 5 分鐘 ,讀取數據庫,更新換成,否則直接讀取緩存數據,當然,緩存需要客戶端用戶激活的,只需一次.
ob_start()函數:打開輸出緩沖區(qū). 函數格式 void ob_start(void) 說明:當緩沖區(qū)激活時,所有來自PHP程序的非文件頭信息均不會發(fā)送,而是保存在內部緩沖區(qū)。為了輸出緩沖區(qū)的內容,可以使用ob_end_flush()或flush()輸出緩沖區(qū)的內容。
Flush:刷新緩沖區(qū)的內容,輸出。 函數格式:flush() 說明:這個函數經常使用,效率很高。
ob_get_contents :返回內部緩沖區(qū)的內容。 函數格式:string ob_get_contents(void) 說明:這個函數會返回當前緩沖區(qū)中的內容,如果輸出緩沖區(qū)沒有激活,則返回 FALSE.
ob_get_length:返回內部緩沖區(qū)的長度。 函數格式:int ob_get_length(void) 說明:這個函數會返回當前緩沖區(qū)中的長度;和ob_get_contents一樣,如果輸出緩沖區(qū)沒有激活,則返回 FALSE.
ob_end_clean:刪除內部緩沖區(qū)的內容,并且關閉內部緩沖區(qū) 函數格式:void ob_end_clean(void) 說明:這個函數不會輸出內部緩沖區(qū)的內容而是把它刪除
ob_end_flush:發(fā)送內部緩沖區(qū)的內容到瀏覽器,并且關閉輸出緩沖區(qū) 函數格式:void ob_end_flush(void) 說明:這個函數發(fā)送輸出緩沖區(qū)的內容(如果有的話)
ob_implicit_flush:打開或關閉絕對刷新 函數格式:void ob_implicit_flush ([int flag]) 說明:默認為關閉緩沖區(qū),打開絕對輸出后,每個腳本輸出都直接發(fā)送到瀏覽器,不再需要調用 flush()
文件寫入:
int fwrite ( resource handle, string string [, int length] ) fwrite() 把 string 的內容寫入 文件指針 handle 處。 如果指定了 length,當寫入了 length 個字節(jié)或者寫完了 string 以后,寫入就會停止,視乎先碰到哪種情況。 fwrite() 返回寫入的字符數,出現錯誤時則返回 FALSE 。 相關參考官方網站: 文件參考
三、解決方案
思路:開啟 ob_start緩沖,當已經調出數據的時候獲取 ob_get_contents,然后生成靜態(tài)頁,ob_end_clean清除緩沖.ok,就這么來,來看一個例子(php+mysql的結合):
創(chuàng)建數據庫:
CREATE TABLE `bihtml` ( `id` int(11) NOT NULL auto_increment, `szdtitle` varchar(16) NOT NULL, `szdcontent` text NOT NULL, PRIMARY KEY (`id`) ) TYPE=MyISAM;
獲取當前的ID,并導入模板:
ob_start(); $id=_POST['id'] if(!isset($id)&&is_integer($id)) { @$db=new mysqli('localhost','root','admin','bihtml'); $result=$db->fetch_one_array("select * from szd_bi where id='$id'"); if(!empty($result)) { $tmp->assign(array( "Szdtitle",htmlspecialchars($result['titles']), "Szdcontent",$result['titles'])); } $tpl->display('default_1.tpl'); $this_my_f= ob_get_contents(); //此處關鍵 ob_end_clean(); $filename = "$id.html"; if(tohtmlfile_cjjer($filename,$this_my_f)) echo "生成成功 $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 ($file_cjjer_name)){ return false; } if (!fwrite ($cjjer_handle,$file_cjjer_content)){ return false; } fclose ($cjjer_handle); //關閉指針 return $file_cjjer_name; }
四、說明事項
1: 一般建議管理員添加數據的時候就生成靜態(tài)頁面,可以考慮記錄生成的文件名次和路徑.
2: php主要是 ob_starts()和 ob_get_contents,生成靜態(tài)頁面的時候很有用,當然也可以考慮調出數據庫直接替換模板里面的變量也是可以的.
3: 主要的模板使用smarty,phplib都是可以的,smarty使用比較簡易.
出處:藍色理想
責任編輯:moby
◎進入論壇網絡編程版塊參加討論
|