談PHP生成靜態(tài)頁(yè)面分析 模板+緩存+寫(xiě)文件
更新時(shí)間:2009年08月17日 16:19:35 作者:
談PHP生成靜態(tài)頁(yè)面 模板+緩存+寫(xiě)文件,大家可以參考下代碼。
一、引 言
在速度上,靜態(tài)頁(yè)面要比動(dòng)態(tài)頁(yè)面的比方php快很多,這是毫無(wú)疑問(wèn)的,但是由于靜態(tài)頁(yè)面的靈活性較差,如果不借助數(shù)據(jù)庫(kù)或其他的設(shè)備保存相關(guān)信息的話(huà),整體的管理上比較繁瑣,比方修改編輯.比方閱讀權(quán)限限制等,但是,對(duì)應(yīng)一些我們經(jīng)常頻頻使用的文件,比方說(shuō),開(kāi)發(fā)的新聞發(fā)布系統(tǒng),我們不希望很多用戶(hù)都讀取數(shù)據(jù)庫(kù)才顯示結(jié)果,這樣一方面消耗了服務(wù)器的資源,另一方面占去了瀏覽者大量可貴的響應(yīng)時(shí)間,所有,有了"靜態(tài)頁(yè)面話(huà)"的做法,當(dāng)前很多網(wǎng)站都采用這種技術(shù),一般都是由管理后臺(tái)控制,或者生成html直接顯示,或者xhtml用css控制顯示,或者生成xml用xslt顯示,這些技術(shù)都不是難的,在這里我就淺顯的說(shuō)說(shuō)生成html的方法.
二、預(yù)備知識(shí)
模板技術(shù):
[PHP] 模板引擎Smarty深入淺出介紹 --2005-12-31
[PHP] 笑談配置,使用Smarty技術(shù) --2006-01-04
緩存技術(shù):
有些信息比方經(jīng)常不變的,但是還是能變的信息放在緩存中以加快顯示速度,這是很有價(jià)值的,所謂的緩存,通俗的理解就是一些保存在服務(wù)器端的共用信息.它是于服務(wù)器同生死的,我們?cè)诒4婢彺娴臅r(shí)候可以指定下次更新的時(shí)間的判斷,比方要在5分鐘更新一次,可以記錄上次更新的時(shí)間,和當(dāng)前時(shí)間比較,如果大于 5 分鐘 ,讀取數(shù)據(jù)庫(kù),更新?lián)Q成,否則直接讀取緩存數(shù)據(jù),當(dāng)然,緩存需要客戶(hù)端用戶(hù)激活的,只需一次.
ob_start()函數(shù):打開(kāi)輸出緩沖區(qū).
函數(shù)格式 void ob_start(void)
說(shuō)明:當(dāng)緩沖區(qū)激活時(shí),所有來(lái)自PHP程序的非文件頭信息均不會(huì)發(fā)送,而是保存在內(nèi)部緩沖區(qū)。為了輸出緩沖區(qū)的內(nèi)容,可以使用ob_end_flush()或flush()輸出緩沖區(qū)的內(nèi)容。
Flush:刷新緩沖區(qū)的內(nèi)容,輸出。
函數(shù)格式:flush()
說(shuō)明:這個(gè)函數(shù)經(jīng)常使用,效率很高。
ob_get_contents :返回內(nèi)部緩沖區(qū)的內(nèi)容。
函數(shù)格式:string ob_get_contents(void)
說(shuō)明:這個(gè)函數(shù)會(huì)返回當(dāng)前緩沖區(qū)中的內(nèi)容,如果輸出緩沖區(qū)沒(méi)有激活,則返回 FALSE.
ob_get_length:返回內(nèi)部緩沖區(qū)的長(zhǎng)度。
函數(shù)格式:int ob_get_length(void)
說(shuō)明:這個(gè)函數(shù)會(huì)返回當(dāng)前緩沖區(qū)中的長(zhǎng)度;和ob_get_contents一樣,如果輸出緩沖區(qū)沒(méi)有激活,則返回 FALSE.
ob_end_clean:刪除內(nèi)部緩沖區(qū)的內(nèi)容,并且關(guān)閉內(nèi)部緩沖區(qū)
函數(shù)格式:void ob_end_clean(void)
說(shuō)明:這個(gè)函數(shù)不會(huì)輸出內(nèi)部緩沖區(qū)的內(nèi)容而是把它刪除
ob_end_flush:發(fā)送內(nèi)部緩沖區(qū)的內(nèi)容到瀏覽器,并且關(guān)閉輸出緩沖區(qū)
函數(shù)格式:void ob_end_flush(void)
說(shuō)明:這個(gè)函數(shù)發(fā)送輸出緩沖區(qū)的內(nèi)容(如果有的話(huà))
ob_implicit_flush:打開(kāi)或關(guān)閉絕對(duì)刷新
函數(shù)格式:void ob_implicit_flush ([int flag])
說(shuō)明:默認(rèn)為關(guān)閉緩沖區(qū),打開(kāi)絕對(duì)輸出后,每個(gè)腳本輸出都直接發(fā)送到瀏覽器,不再需要調(diào)用 flush()
文件寫(xiě)入:
int fwrite ( resource handle, string string [, int length] )
fwrite() 把 string 的內(nèi)容寫(xiě)入 文件指針 handle 處。 如果指定了 length,當(dāng)寫(xiě)入了 length 個(gè)字節(jié)或者寫(xiě)完了 string 以后,寫(xiě)入就會(huì)停止,視乎先碰到哪種情況。
fwrite() 返回寫(xiě)入的字符數(shù),出現(xiàn)錯(cuò)誤時(shí)則返回 FALSE 。
相關(guān)參考官方網(wǎng)站: 文件參考
三、解決方案
思路:開(kāi)啟 ob_start緩沖,當(dāng)已經(jīng)調(diào)出數(shù)據(jù)的時(shí)候獲取 ob_get_contents,然后生成靜態(tài)頁(yè),ob_end_clean清除緩沖.ok,就這么來(lái),來(lái)看一個(gè)例子(php+mysql的結(jié)合):
創(chuàng)建數(shù)據(jù)庫(kù):
Create TABLE `bihtml` (
`id` int(11) NOT NULL auto_increment,
`szdtitle` varchar(16) NOT NULL,
`szdcontent` text NOT NULL,
PRIMARY KEY (`id`)
) TYPE
獲取當(dāng)前的ID,并導(dǎo)入模板:
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(!emptyempty($result))
{
$tmp->assign(array(
"Szdtitle",htmlspecialchars($result['titles']),
"Szdcontent",$result['titles']));
}
$tpl->display('default_1.tpl');
$this_my_f= ob_get_contents(); //此處關(guān)鍵
ob_end_clean();
$filename = "$id.html";
if(tohtmlfile_cjjer($filename,$this_my_f))
echo "生成成功 $filename";
else
echo "生成識(shí)別";
}
}
//把生成文件的過(guò)程寫(xiě)出函數(shù)
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); //關(guān)閉指針
return $file_cjjer_name;
}
四、說(shuō)明事項(xiàng)
1: 一般建議管理員添加數(shù)據(jù)的時(shí)候就生成靜態(tài)頁(yè)面,可以考慮記錄生成的文件名次和路徑.
2: php主要是 ob_starts()和 ob_get_contents,生成靜態(tài)頁(yè)面的時(shí)候很有用,當(dāng)然也可以考慮調(diào)出數(shù)據(jù)庫(kù)直接替換模板里面的變量也是可以的.
3: 主要的模板使用smarty,phplib都是可以的,smarty使用比較簡(jiǎn)易.
在速度上,靜態(tài)頁(yè)面要比動(dòng)態(tài)頁(yè)面的比方php快很多,這是毫無(wú)疑問(wèn)的,但是由于靜態(tài)頁(yè)面的靈活性較差,如果不借助數(shù)據(jù)庫(kù)或其他的設(shè)備保存相關(guān)信息的話(huà),整體的管理上比較繁瑣,比方修改編輯.比方閱讀權(quán)限限制等,但是,對(duì)應(yīng)一些我們經(jīng)常頻頻使用的文件,比方說(shuō),開(kāi)發(fā)的新聞發(fā)布系統(tǒng),我們不希望很多用戶(hù)都讀取數(shù)據(jù)庫(kù)才顯示結(jié)果,這樣一方面消耗了服務(wù)器的資源,另一方面占去了瀏覽者大量可貴的響應(yīng)時(shí)間,所有,有了"靜態(tài)頁(yè)面話(huà)"的做法,當(dāng)前很多網(wǎng)站都采用這種技術(shù),一般都是由管理后臺(tái)控制,或者生成html直接顯示,或者xhtml用css控制顯示,或者生成xml用xslt顯示,這些技術(shù)都不是難的,在這里我就淺顯的說(shuō)說(shuō)生成html的方法.
二、預(yù)備知識(shí)
模板技術(shù):
[PHP] 模板引擎Smarty深入淺出介紹 --2005-12-31
[PHP] 笑談配置,使用Smarty技術(shù) --2006-01-04
緩存技術(shù):
有些信息比方經(jīng)常不變的,但是還是能變的信息放在緩存中以加快顯示速度,這是很有價(jià)值的,所謂的緩存,通俗的理解就是一些保存在服務(wù)器端的共用信息.它是于服務(wù)器同生死的,我們?cè)诒4婢彺娴臅r(shí)候可以指定下次更新的時(shí)間的判斷,比方要在5分鐘更新一次,可以記錄上次更新的時(shí)間,和當(dāng)前時(shí)間比較,如果大于 5 分鐘 ,讀取數(shù)據(jù)庫(kù),更新?lián)Q成,否則直接讀取緩存數(shù)據(jù),當(dāng)然,緩存需要客戶(hù)端用戶(hù)激活的,只需一次.
ob_start()函數(shù):打開(kāi)輸出緩沖區(qū).
函數(shù)格式 void ob_start(void)
說(shuō)明:當(dāng)緩沖區(qū)激活時(shí),所有來(lái)自PHP程序的非文件頭信息均不會(huì)發(fā)送,而是保存在內(nèi)部緩沖區(qū)。為了輸出緩沖區(qū)的內(nèi)容,可以使用ob_end_flush()或flush()輸出緩沖區(qū)的內(nèi)容。
Flush:刷新緩沖區(qū)的內(nèi)容,輸出。
函數(shù)格式:flush()
說(shuō)明:這個(gè)函數(shù)經(jīng)常使用,效率很高。
ob_get_contents :返回內(nèi)部緩沖區(qū)的內(nèi)容。
函數(shù)格式:string ob_get_contents(void)
說(shuō)明:這個(gè)函數(shù)會(huì)返回當(dāng)前緩沖區(qū)中的內(nèi)容,如果輸出緩沖區(qū)沒(méi)有激活,則返回 FALSE.
ob_get_length:返回內(nèi)部緩沖區(qū)的長(zhǎng)度。
函數(shù)格式:int ob_get_length(void)
說(shuō)明:這個(gè)函數(shù)會(huì)返回當(dāng)前緩沖區(qū)中的長(zhǎng)度;和ob_get_contents一樣,如果輸出緩沖區(qū)沒(méi)有激活,則返回 FALSE.
ob_end_clean:刪除內(nèi)部緩沖區(qū)的內(nèi)容,并且關(guān)閉內(nèi)部緩沖區(qū)
函數(shù)格式:void ob_end_clean(void)
說(shuō)明:這個(gè)函數(shù)不會(huì)輸出內(nèi)部緩沖區(qū)的內(nèi)容而是把它刪除
ob_end_flush:發(fā)送內(nèi)部緩沖區(qū)的內(nèi)容到瀏覽器,并且關(guān)閉輸出緩沖區(qū)
函數(shù)格式:void ob_end_flush(void)
說(shuō)明:這個(gè)函數(shù)發(fā)送輸出緩沖區(qū)的內(nèi)容(如果有的話(huà))
ob_implicit_flush:打開(kāi)或關(guān)閉絕對(duì)刷新
函數(shù)格式:void ob_implicit_flush ([int flag])
說(shuō)明:默認(rèn)為關(guān)閉緩沖區(qū),打開(kāi)絕對(duì)輸出后,每個(gè)腳本輸出都直接發(fā)送到瀏覽器,不再需要調(diào)用 flush()
文件寫(xiě)入:
int fwrite ( resource handle, string string [, int length] )
fwrite() 把 string 的內(nèi)容寫(xiě)入 文件指針 handle 處。 如果指定了 length,當(dāng)寫(xiě)入了 length 個(gè)字節(jié)或者寫(xiě)完了 string 以后,寫(xiě)入就會(huì)停止,視乎先碰到哪種情況。
fwrite() 返回寫(xiě)入的字符數(shù),出現(xiàn)錯(cuò)誤時(shí)則返回 FALSE 。
相關(guān)參考官方網(wǎng)站: 文件參考
三、解決方案
思路:開(kāi)啟 ob_start緩沖,當(dāng)已經(jīng)調(diào)出數(shù)據(jù)的時(shí)候獲取 ob_get_contents,然后生成靜態(tài)頁(yè),ob_end_clean清除緩沖.ok,就這么來(lái),來(lái)看一個(gè)例子(php+mysql的結(jié)合):
創(chuàng)建數(shù)據(jù)庫(kù):
復(fù)制代碼 代碼如下:
Create TABLE `bihtml` (
`id` int(11) NOT NULL auto_increment,
`szdtitle` varchar(16) NOT NULL,
`szdcontent` text NOT NULL,
PRIMARY KEY (`id`)
) TYPE
獲取當(dāng)前的ID,并導(dǎo)入模板:
復(fù)制代碼 代碼如下:
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(!emptyempty($result))
{
$tmp->assign(array(
"Szdtitle",htmlspecialchars($result['titles']),
"Szdcontent",$result['titles']));
}
$tpl->display('default_1.tpl');
$this_my_f= ob_get_contents(); //此處關(guān)鍵
ob_end_clean();
$filename = "$id.html";
if(tohtmlfile_cjjer($filename,$this_my_f))
echo "生成成功 $filename";
else
echo "生成識(shí)別";
}
}
//把生成文件的過(guò)程寫(xiě)出函數(shù)
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); //關(guān)閉指針
return $file_cjjer_name;
}
四、說(shuō)明事項(xiàng)
1: 一般建議管理員添加數(shù)據(jù)的時(shí)候就生成靜態(tài)頁(yè)面,可以考慮記錄生成的文件名次和路徑.
2: php主要是 ob_starts()和 ob_get_contents,生成靜態(tài)頁(yè)面的時(shí)候很有用,當(dāng)然也可以考慮調(diào)出數(shù)據(jù)庫(kù)直接替換模板里面的變量也是可以的.
3: 主要的模板使用smarty,phplib都是可以的,smarty使用比較簡(jiǎn)易.
您可能感興趣的文章:
- PHP生成HTML靜態(tài)頁(yè)面實(shí)例代碼
- 使用PHP實(shí)現(xiàn)生成HTML靜態(tài)頁(yè)面
- 比較詳細(xì)PHP生成靜態(tài)頁(yè)面教程
- php 生成靜態(tài)頁(yè)面的辦法與實(shí)現(xiàn)代碼詳細(xì)版
- 用php的ob_start來(lái)生成靜態(tài)頁(yè)面的方法分析
- php文章內(nèi)容分頁(yè)并生成相應(yīng)的htm靜態(tài)頁(yè)面代碼
- 方便實(shí)用的PHP生成靜態(tài)頁(yè)面類(lèi)(非smarty)
- php生成靜態(tài)頁(yè)面的簡(jiǎn)單示例
- PHP生成靜態(tài)頁(yè)面詳解
- php輸出控制函數(shù)和輸出函數(shù)生成靜態(tài)頁(yè)面
相關(guān)文章
Uncaught exception com_exception with message Failed to crea
Fatal error: Uncaught exception 'com_exception' with message 'Failed to create COM object `InternetExplorer.Application': 拒絕訪問(wèn)2012-01-01
使用PHP和RabbitMQ實(shí)現(xiàn)消息隊(duì)列功能
這篇文章主要介紹了如何使用PHP和RabbitMQ實(shí)現(xiàn)消息隊(duì)列功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用PHP具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-03-03
PHP數(shù)組常用函數(shù)實(shí)例小結(jié)
這篇文章主要介紹了PHP數(shù)組常用函數(shù),結(jié)合實(shí)例形式總結(jié)分析了php針對(duì)數(shù)組的統(tǒng)計(jì)、計(jì)算、去重、過(guò)濾等相關(guān)函數(shù)使用技巧,需要的朋友可以參考下2018-08-08
php使用memcoder將視頻轉(zhuǎn)成mp4格式的方法
這篇文章主要介紹了php使用memcoder將視頻轉(zhuǎn)成mp4格式的方法,涉及php操作視頻文件的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03
php快速u(mài)rl重寫(xiě)更新版[需php 5.30以上]
本代碼是在apache上的LoadModule rewrite_module modules/mod_rewrite.so運(yùn)行成功后的操作,利用php代碼對(duì)網(wǎng)站url重定向?yàn)楦鼜?fù)雜的邏輯結(jié)構(gòu)。2010-04-04
PHP實(shí)現(xiàn)股票趨勢(shì)圖和柱形圖
這篇文章主要介紹了PHP實(shí)現(xiàn)股票趨勢(shì)圖和柱形圖,本文效果基于pchart類(lèi)庫(kù)實(shí)現(xiàn),給出實(shí)現(xiàn)代碼和效果圖,需要的朋友可以參考下2015-02-02
php寫(xiě)入數(shù)據(jù)到CSV文件的方法
這篇文章主要介紹了php寫(xiě)入數(shù)據(jù)到CSV文件的方法,涉及php操作csv文件的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-03-03
php 表單提交大量數(shù)據(jù)發(fā)生丟失的解決方法
這篇文章主要介紹了php表單提交大量數(shù)據(jù)、上千個(gè)文本框時(shí)發(fā)生數(shù)據(jù)丟失、數(shù)據(jù)不完整等問(wèn)題的解決方法,需要的朋友可以參考下2014-03-03

