1、引 言php
在速度上,靜態頁面要比動態頁面的比方php快不少,這是毫無疑問的,可是因爲靜態頁面的靈活性較差,若是不借助數據庫或其餘的設備保存相關信息的話,總體的管理上比較繁瑣,比方修改編輯.比方閱讀權限限制等,可是,對應一些咱們常常頻頻使用的文件,比方說,開發的新聞發佈系統,咱們不但願不少用戶都讀取數據庫才顯示結果,這樣一方面消耗了服務器的資源,另外一方面佔去了瀏覽者大量難得的響應時間,全部,有了"靜態頁面話"的作法,當前不少網站都採用這種技術,通常都是由管理後臺控制,或者生成html直接顯示,或者xhtml用css控制顯示,或者生成xml用xslt顯示,這些技術都不是難的,在這裏我就淺顯的說說生成html的方法.css
2、預備知識html
模板技術:mysql
[PHP] 模板引擎Smarty深刻淺出介紹 --2005-12-31linux
[PHP] 笑談配置,使用Smarty技術 --2006-01-04程序員
緩存技術:sql
有些信息比方常常不變的,可是仍是能變的信息放在緩存中以加快顯示速度,這是頗有價值的,所謂的緩存,通俗的理解就是一些保存在服務器端的共用信息.它是於服務器同生死的,咱們在保存緩存的時候能夠指定下次更新的時間的判斷,比方要在5分鐘更新一次,能夠記錄上次更新的時間,和當前時間比較,若是大於 5 分鐘 ,讀取數據庫,更新換成,不然直接讀取緩存數據,固然,緩存須要客戶端用戶激活的,只需一次.數據庫
ob_start()函數:打開輸出緩衝區.apache
函數格式 void ob_start(void)瀏覽器
說明:當緩衝區激活時,全部來自PHP程序的非文件頭信息均不會發送,而是保存在內部緩衝區。爲了輸出緩衝區的內容,可使用ob_end_flush()或flush()輸出緩衝區的內容。
Flush:刷新緩衝區的內容,輸出。
函數格式:flush()
說明:這個函數常用,效率很高。
ob_get_contents :返回內部緩衝區的內容。
函數格式:string ob_get_contents(void)
說明:這個函數會返回當前緩衝區中的內容,若是輸出緩衝區沒有激活,則返回 FALSE.
ob_get_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 。
相關參考官方網站: 文件參考
3、解決方案
思路:開啓 ob_start緩衝,當已經調出數據的時候獲取 ob_get_contents,而後生成靜態頁,ob_end_clean清除緩衝.ok,就這麼來,來看一個例子(php+mysql的結合):
建立數據庫:
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;
}
4、說明事項
1: 通常建議管理員添加數據的時候就生成靜態頁面,能夠考慮記錄生成的文件名次和路徑.
2: php主要是 ob_starts()和 ob_get_contents,生成靜態頁面的時候頗有用,固然也能夠考慮調出數據庫直接替換模板裏面的變量也是能夠的.
3: 主要的模板使用smarty,phplib都是能夠的,smarty使用比較簡易.
*****************************************************
1.管理後臺添加記錄時,直接生成目標html頁面,而且前臺調用鏈接直接指向生成的html頁面。這種方法程優勢是程序效率最高。
服務器負荷輕,不過因爲生成的是純靜態頁面,一旦頁面樣式(模版及css=theme)上有所改動就必須從新生成全部的內容頁。
因此實際使用中應用通常不是太多。更多的是使用js,ssi,xml/xsl等客戶端手段,生成的靜態文件中僅保存數據,不涉及樣式,
這樣能達到速度和維護性的平衡,不過相對先後臺程序要複雜些(應用這種方法時,因爲內容爲純靜態,能夠搭配單獨編譯的純靜態的apache使用。。效率和資源佔用上比包含動態內容支持的要更佳)
====
補充:
a.上面說的改動樣式,要從新生成全部的內容頁,能夠經過:
>>>>在能夠在每一個生成的頁面內嵌入一個<scrīptsrc=XXX.php?id=xxx&template=red></scrīpt>來判斷是否須要從新生成該頁面。
>>>>apache的ErrorDocument404功能,可是這裏前臺連接是指向html的,若是該html不存在,會經過apache的文件不存在重定向到404處理程序的功能從新生成html
(注:httpd.conf加ErrorDocument404/errprocess.php指令),利用這個功能能夠解決修改網站樣式的時候,要更新全部生成的html文件的問題,
將整個static文件夾刪除便可。
b.經過嵌入<scrīpt></scrīpt>js來調用php的方式,更改許多須要變化的地方(如點擊率之類的)
2.前臺訪問連接指向php程序,php程序首先檢查是否存在相應的靜態文件。若是靜態文件不存在。則生成並重定向至此文件,不然直接重定向。
這種方法實際使用中通常和apache的url_rewrite功能一塊兒使用。將php的文件地址重顯示爲html的形式,有利於搜索引擎的檢索。
這種方法在效率上略有損失,不過程序結構簡單,便於調整,在訪問量不是很大時使用很合適。
注意事項:
全部生成的html文件都集中放到一個文件夾,其中還應該注意生成文件若是不少的話(如論壇),訪問其中一個htm文件,將會變得很慢,
那麼最好經過
>>>>按日期來分隔文件夾,如static/2004/11/18/0001.htm
>>>>對帖子id根據數據庫中字段長度作str_pad:比方說id爲123456,數據庫中爲int(11),則id處理爲00000123456,考慮到linux下通常同一下文件到達四位數會有性能影響,對其作切割,最後路徑爲static/00/000/123/456.html
------------------------------------------------------------------------
淺談PHP生成靜態頁的兩種方法
最近做的一個項目中用到了兩種用PHP生成靜態頁面的方法,回想起當初本身還不知道如何生成靜態頁面的迷惘,以及看不懂高手寫的文章的痛苦,以爲本身有必要站出來爲還不知道如何生成靜態頁的phper寫一個通俗點文章,以幫助他們儘快掌握這個好東西。
在我以前所見的文章中要不是用代碼堆砌空間就是用高手與高手交流用的語言讓新人望而生卻。所以本文儘可能把總體思路說得詳盡點。
兩種方法簡單說明以下:
1. 使用文件函數獲得靜態頁面的模板字符串,而後用str_replace函數將須要替換的東西替換了再寫入到新的文件中。
2. 利用PHP的輸出控制函數(Output Control)獲得靜態頁面字符串,再寫入到新的文件中。
下面開始詳細的說明。
一. 利用模板生成
什麼是模板?若是你們使用過Dreamwerver中的"另存爲模板"就應該知道模板是用來統一風格的東西。它只讓你修改頁面的某一部分,固然這"某一部 分"是由你來肯定的。本文在這說的模板也就是這個意思。(此外,PHP模板技術還包括phplib、smarty等等,這不是本文所說內容了)
把模板的概念結合本文再說得具體一點就是:美工先作好一個頁面,而後咱們把這個頁面看成模板(要注意的是這個模板就不必使用<!-- TemplateBeginEditable name="EditRegion3" -->EditRegion3<!-- TemplateEndEditable -->這樣的代碼了,這種代碼是Dreamwerver爲了方便本身設計而弄的標識),把這個模板中咱們須要改變的地方用一個與HTML能夠區分的 字符代替,如"{title}"、"[title]"。在生成靜態頁面的時候只須要把數據和這些字符串替換便可。這就是模板的含義了。
下面來講一下具體的實現思路:作一個模板――在模板裏面把須要改變的地方用特殊的字符代替――將模板中的內容取出來存放到一個字符串中(這個字符串的內容 就是HTML代碼和上面所說的特殊字符了)――使用函數將這個字符串裏面的特殊字符用咱們須要在頁面上顯示的內容替換――把替換後的字符串寫到一個新 的.htm頁面裏面――成功了!
功能的實現離不開PHP函數的幫忙。知道總體思路後最重要的就是去手冊裏面找相關的函數了。
首先,咱們要把模板裏面的HTML代碼取出來放到一個變量中去,這個變量的值就是包含HTML的字符串了。咱們可使用string fread ( int handle, int length )函數來實現,仔細一看裏面的參數"handle"是一個文件指針,這意味着咱們得先把模板文件打開(PHP這一點至關麻煩,難道它就不能弄得一步到位 嗎!!!)。好,咱們繼續找能把文件打開的函數:resource fopen ( string filename, string mode [, bool use_include_path [, resource zcontext]] ),在這裏咱們只要傳入前兩個參數就能夠了,第一個參數就是文件名字了,記得路徑不要弄錯;第二個參數建議使用"rb","r"表明只讀方式打開,並將文 件指針指向文件頭,"b" 是指強制使用二進制模式,手冊中建議:爲移植性考慮,強烈建議在用 fopen() 打開文件時老是使用 'b' 標記。
在這一步咱們的代碼能夠這樣寫:
CODE:[Copy to clipboard]<?php
$filemodel="template/it.php"; #模板地址
$file=fopen($filemodel,"rb"); #打開模板,獲得文件指針
$temp=fread($file,filesize($filemodel)); #獲得模板文件html代碼
?>提醒一下:若是你只是想將一個文件的內容讀入到一個字符串中,用 file_get_contents(),它的性能比fread()的代碼好得多(這是手冊上的原話,不過這個函數是在PHP5中支持的)。
第二步,使用str_replace()函數將獲得的文件字符替換相關內容,替換的方法就是把從數據庫中取出的內容或經過表單的獲得的數據把模板中的特殊字符替換了。這一步很簡單,也許剛開始想不明白,可是一看代碼就一目瞭然了:
CODE:[Copy to clipboard]<?php
$temp=str_replace("[title]",$title,$temp);
?>上面的""[title]""就是模板文件中的特殊字符(是[title],不是"[title]"),"$title"就是咱們想在頁面上顯示的內容,"$temp"就是模板文件html代碼了。
若是還須要替換,則繼續使用str_replace()函數就能夠了,如:
CODE:[Copy to clipboard]<?php
$temp=str_replace("[postTime]",$postTime,$temp);
$temp=str_replace("[content]",$content,$temp);
?>第三步,也就是第一步的反操做了:要把以前處理過的模板字符串寫入另外一個文件中去,而這個文件就是咱們最終能夠對外顯示的頁面。如今重複相似第一步的二部曲:打開文件,寫入文件:
CODE:[Copy to clipboard]<?php
fwrite(fopen("$filename","wb"),$temp); #$filename是靜態頁面的文件名
?>fwrite的做用就是把字符串的內容寫入文件中去了。
一樣,也可使用file_put_contents函數寫文件,但記得是在PHP5中。
這樣,咱們就能夠用模板生成靜態頁面了。
二. 利用輸出控制函數(Output Control)生成靜態頁面
這個與用模板生成的相比相對高級一點,但一旦明白了它的實現思路,倒是簡單無比,所謂會者不難,難者不會大概就是這麼一回事吧。
這種方法比模板生成的方法應用面更大。使用模板生成方法通常用於發表或修改文章時使用,這樣的話數據庫能夠直接從表單獲得,就無須經過數據庫了。當若是需 要從數據庫取出數據,而且替換的東西比較多,更或者你須要的頁面並不只僅是經過簡單的替換就能獲得的,好比說站點的首頁。這時,就有必要考慮使用輸出控制 函數了。
輸出控制函數的做用是設置緩衝區,在緩衝區裏面輸出的內容能夠被得到。得到輸出內容整個過程只須要使用三個函數即可以了:ob_start()、ob_get_contents()、ob_end_clean()
方法思路以下:設置緩衝區起點(或設置輸出內容的起點)――釋放內容――取得內容――清空緩衝區――把取得的內容寫如文件。
相關函數說明以下:
一、ob_start :打開輸出緩衝區
函數格式:void ob_start(void)
說明:當緩衝區激活時,全部來自PHP程序的非文件頭信息均不會發送,而是保存在內部緩衝區。
爲了輸出緩衝區的內容,可使用ob_end_flush()或flush()輸出緩衝區的內容。
2 、ob_get_contents :返回內部緩衝區的內容。
使用方法:string ob_get_contents(void)
說明:這個函數會返回當前緩衝區中的內容,若是輸出緩衝區沒有激活,則返回 FALSE 。
三、ob_end_clean:刪除內部緩衝區的內容,而且關閉內部緩衝區
使用方法:void ob_end_clean(void)
說明:這個函數不會輸出內部緩衝區的內容而是把它刪除!
精彩開始了,看看咱們是如何利用輸出緩衝生成靜態頁面的:
咱們用函數來實現吧!
CODE:[Copy to clipboard]<?php
#write by yayu
function createStaticPage($sourcePage,$objectPage)#來源文件,目標文件
{
#獲得兩個參數,一個是來源文件地址,一個是須要生成的靜態頁面地址
global $db; #數據庫鏈接用的,在$sourcePage中須要用到
ob_start(); #打開緩衝區,至關於作了一個用來存放東西的箱子
include $sourcePage; #在緩衝區中釋放頁面,從這個代碼中應該能夠明白一點:那就是$sourcePage頁面單獨查看的時候,它是能夠顯示的!這是關鍵之所在,若是後面不加ob_end_clean()函數,那在執行程序的時候你看見$sourcePage頁面的內容。
$cons=ob_get_contents(); #獲得緩衝區中的內容,這裏的內容就是HTML代碼!這至關於把箱子裏面的東西轉給了一我的!
ob_end_clean(); #清除緩衝區的內容,把箱子裏面的東西轉給他人後,打掃衛生,不打掃衛生的後果是讓他人能夠看見箱子的東西,也便可以看見$sourcePage頁面的內容
$fp=fopen($objectPage,"wb") or die("靜態生成時打開文件".$objectPage."時出錯");
fwrite($fp,$cons); #把HTML代碼寫入靜態文件中!
fclose($fp);
return true;
}
?>總結:
1. 兩種方法都有把內容寫入你要生成的靜態頁面中的一步。
2. 當可使用第一種方法時就使用第一種方法,由於第二種方法要經過數據庫調內容並顯示(也能夠說是隱藏了顯示的內容,但事實上$sourcePage裏的程序是執行的)的過程。
3. 具體狀況其餘分析,在使用模板生成時因爲可能直接使用表單提交的內容,因此須要過濾之類的檢查。
*******************************************************
PHP生成靜態頁面
看到不少朋友在各個地方發帖問PHP生成靜態文章系統的方法,之前曾作過這樣一個系統,遂談些見解,以供各位參考。好了,咱們先回顧一些基本的概念。
一,PHP腳本與動態頁面。
PHP腳本是一種服務器端腳本程序,可經過嵌入等方法與HTML文件混合,也能夠類,函數封裝等形式,以模板的方式對用戶請求進行處理。不管以何種方式,它的基本原理是這樣的。由客戶端提出請求,請求某一頁面 -----> WEB服務器引入指定相應腳本進行處理 -----> 腳本被載入服務器 -----> 由服務器指定的PHP解析器對腳本進行解析造成HTML語言形式 ----> 將解析後的HTML語句以包的方式傳回給瀏覽器。由此不難看出,在頁面發送到瀏覽器後,PHP就不存在了,已被轉化解析爲HTML語句。客戶請求爲一動態文件,事實上並無真正的文件存在在那裏,是PHP解析而成相對應的頁面,而後發送回瀏覽器。這種頁面處理方式被稱爲"動態頁面"。
二,靜態頁面。
靜態頁面是指在服務器端確實存在的僅含HTML以及JS,CSS等客戶端運行腳本的頁面。它的處理方式是。由客戶端提出請求,請求某一頁面 ----> WEB服務器確認並載入某一頁面 ----> WEB服務器將該頁面以包的形式傳遞迴瀏覽器。由這一過程,咱們對比一下動態頁面,便可方現。動態頁面需由WEB服務器的PHP解析器進行解析,並且一般還需鏈接數據庫,進行數據庫存取操做,而後才能造成HTML語言信息包;而靜態頁面,無須解析,無須鏈接數據庫,直接發送,可大大減輕服務器壓力,提升服務器負載能力,大幅提供頁面打開速度和網站總體打開速度。但其缺點是,不能動態地對請求進行處理,服務器上必須確實存在該文件。
三,模板及模板解析。
模板即還沒有填充內容html文件。例如:
temp.html
<HTML>
<TITLE>{ title}</TITLE>
<BODY>
this is a { file} file's templets
</BODY>
</HTML>
PHP處理:
templetest.php
<?php
$title = "九網互聯測試模板";
$file = "Webjx test templet,<br>author:";
$fp= fopen ("temp.html","r");
$content = fread ($fp,filesize ("temp.html"));
$content .= str_replace ("{ file}",$file,$content);
$content .= str_replace ("{ title}",$title,$content);
echo $content;
?>
模板解析處理,即將經PHP腳本解析處理後得出的結果填充(content)進模板的處理過程。一般藉助於模板類。目前較流行的模板解析類有phplib,smarty,fastsmarty等等。模板解析處理的原理一般爲替換。也有些程序員習慣將判斷,循環等處理放進模板文件中,用解析類處理,典型應用爲block概念,簡單來講即爲一個循環處理。由PHP腳本指定循環次數,如何循環代入等,再由模板解析類具體實施這些操做。
好了,對比過靜態頁面與動態頁面各自的優劣,如今咱們就來講說,如何用PHP生成靜態文件。
PHP生成靜態頁面並非指PHP的動態解析,輸出HTML頁面,而是指用PHP建立HTML頁面。同時由於HTML的不可寫性,咱們建立的HTML如有修改,則需刪掉從新生成便可。(固然你也能夠選擇用正則進行修改,但我的認爲那樣作倒不如刪掉從新生成來得快捷,有些得不償失。)
言歸正傳。用過PHP文件操做函數的PHP FANS知道,PHP中有一個文件操做函數fopen,即打開文件。若文件不存在,則嘗試建立。這便是PHP能夠用來建立HTML文件的理論基礎。只要用來存放HTML文件的文件夾有寫權限(即權限定義0777),便可建立文件。(針對UNIX系統而言,Win系統無須考慮。)仍以上例爲例,若咱們修改最後一句,並指定在test目錄下生成一個名爲test.html的靜態文件:
<?php
$title = "九網互聯測試模板";
$file = "Webjx test templet,<br>author:";
$fp = fopen ("temp.html","r");
$content = fread ($fp,filesize ("temp.html"));
$content .= str_replace ("{ file}",$file,$content);
$content .= str_replace ("{ title}",$title,$content);
// echo $content;
$filename = "test/test.html";
$handle = fopen ($filename,"w"); //打開文件指針,建立文件
/*
檢查文件是否被建立且可寫
*/
if (!is_writable ($filename)){
die ("文件:".$filename."不可寫,請檢查其屬性後重試!");
}
if (!fwrite ($handle,$content)){ //將信息寫入文件
die ("生成文件".$filename."失敗!");
}
fclose ($handle); //關閉指針
die ("建立文件".$filename."成功!");
?>
實際應用中常見問題解決方案參考:
一,文章列表問題:
在數據庫中建立字段,記錄文件名,每生成一個文件,將自動生成的文件名存入數據庫,對於推薦文章,只需指向存放靜態文件的指定文件夾中的該頁面便可。利用PHP操做處理文章列表,存爲字符串,生成頁面時替換此字符串便可。如,在頁面中放置文章列表的表格加入標記{ articletable},而在PHP處理文件中:
<?php
$title = "九網互聯測試模板";
$file = "Webjx test templet,<br>author:";
$fp = fopen ("temp.html","r");
$content = fread ($fp,filesize ("temp.html"));
$content .= str_replace ("{ file}",$file,$content);
$content .= str_replace ("{ title}",$title,$content);
// 生成列表開始
$list = '';
$sql = "select id, title,filename from article";
$query = mysql_query ($sql);
while ($result = mysql_fetch_array($query)){
$list .= '<a href='.$root.$result['filename'].' target=_blank>'.$result['title'].'</a><br>';
}
$content .= str_replace ("{ articletable}",$list,$content);
//生成列表結束
// echo $content;
$filename = "test/test.html";
$handle = fopen ($filename,"w"); //打開文件指針,建立文件
/*
檢查文件是否被建立且可寫
*/
if (!is_writable ($filename)){
die ("文件:".$filename."不可寫,請檢查其屬性後重試!");
}
if (!fwrite ($handle,$content)){ //將信息寫入文件
die ("生成文件".$filename."失敗!");
}
fclose ($handle); //關閉指針
die ("建立文件".$filename."成功!");
?>
二,分頁問題。
如咱們指定分頁時,每頁20篇。某子頻道列表內文章經數據庫查詢爲45條,則,首先咱們經過查詢獲得以下參數:1,總頁數;2,每頁篇數。第二步,for ($i = 0; $i < allpages; $i++),頁面元素獲取,分析,文章生成,都在此循環中執行。不一樣的是,die ("建立文件".$filename."成功!";這句去掉,放到循環後的顯示,由於該語句將停止程序執行。例:
<?php
$fp=fopen ("temp.html","r");
$content = fread ($fp,filesize ("temp.html"));
$onepage = '20';
$sql = "select id from article where channel='$channelid'";
$query = mysql_query ($sql);
$num = mysql_num_rows ($query);
$allpages = ceil ($num / $onepage);
for ($i = 0;$i<$allpages; $i++){
if ($i == 0){
$indexpath = "index.html";
} else {
$indexpath = "index_".$i."html";
}
$start = $i * $onepage;
$list = '';
$sql_for_page = "select name, filename,title from article where channel='$channelid' limit $start,$onepage";
$query_for_page = mysql_query ($sql_for_page);
while ($result = $query_for_page){
$list .= '<a href='.$root.$result['filename'].' target=_blank>'.$title.'</a><br>';
}
$content = str_replace ("{ articletable}",$list,$content);
if (is_file ($indexpath)){
@unlink ($indexpath); //若文件已存在,則刪除
}
$handle = fopen ($indexpath,"w"); //打開文件指針,建立文件
/*
檢查文件是否被建立且可寫
*/
if (!is_writable ($indexpath)){
echo "文件:".$indexpath."不可寫,請檢查其屬性後重試!"; //修改成echo
}
if (!fwrite ($handle,$content)){ //將信息寫入文件
echo "生成文件".$indexpath."失敗!"; //修改成echo
}
fclose ($handle); //關閉指針
}
fclose ($fp);
die ("生成分頁文件完成,如生成不徹底,請檢查文件權限系統後從新生成!");
?>
大體思路如此,其中如其它數據生成,數據輸入輸出檢查,分頁內容指向等可酌情在頁面中加入。
在實際文章系統處理過程中,還有許多問題有待考慮,與動態頁面不一樣之處,需注意的地方還有不少。但大體思路便是如此,其它方面可觸類旁通而得。
**********************************************************
目前網絡上好多網站的新聞發佈系統都採用了動態服務器技術生成靜態HTML的作法,這樣作的好處是:一是能減輕其服務器的負擔,二是由於生成了HTML靜態頁面,因此其網站被搜索引擎搜索到的機率更大一些。筆者的網站曾經使用PHP這一動態技術來構建新聞發佈系統,其原理也就是應用了PHP生成HTML靜態頁面的技術,相關平臺是 Windows XP Sp2+php4.32+mysql,所以,在這裏,想簡單地談一下這種作法的思路。這篇文章適合於對PHP+MYSQL數據庫操做,SQL語句以及網頁設計有點基礎的朋友,若是您是一個從頭開始學的朋友,那麼請先打好基礎吧!到這裏就不用往下看了。若是您都符合上述條件的話,那麼恭喜您,請接着往下看。可是,在具體動手構建以前,您還要作好如下幾點準備工做。
1、 具有本地調試PHP的功能
在WINDOWS XP操做系統下,筆者建議你能夠到網上下載一個PHP+MYSQL+APACHE的服務器套裝,如華軍軟件園,去那裏搜索一下就能夠下載到。下載完後默認安裝便可,這樣您就具有了在本地測試PHP的功能了,省去了不少手動配置的麻煩,怎麼樣,簡單吧,OK,這僅僅只是第一步。
2、 構思新聞發佈系統所具有的功能
首頁的新聞發佈每每是經過後臺更新的,後臺的更新無非是由添加、編輯、刪除數據等基本的功能所實現的。在這裏,你可使用網頁設計軟件來構建你的想要的後臺界面,其功能的實現固然是要用到PHP嘍。這一步建議您先想好新聞發佈系統要有的功能。在這裏,如何用PHP添加、編輯、刪除數據就再也不重複,由於重點是如何在這基礎上生成靜態技術。
3、 PHP生成HTML的技術原理。
哈哈。費話說了那麼多,終於到了該講的地方了。其實,這一原理並不複雜,綜合地來說的話,應該是PHP中一個替換數據語法的應用。OK,講一個簡單範例吧,一步一步地分析!相信聰明的你能看得明白的咯,仔細看好每一步便可,在這裏,只是引導你們如何作而已,具體的能夠實踐一下!
(1)在MYSQL裏新建一數據庫,命名爲 database (可自定義),新建一表,命名爲 news(由於是新聞發佈嘛,取個好記的名字便可,可自定義),而後創建這幾個字段名:
id (自動遞增,這是關鍵,類型:INT)
title (顧名思義,新聞標題,類型可取 TEXT)
content (新聞內容,類型可取 TEXT)
path (HTML文件路徑,類型可取 TEXT)
(2)創建 conn.php
這是鏈接數據庫的PHP文件,你能夠把鏈接數據的語句單獨放在這一文件裏,之後多個須要鏈接數據庫的文件直接引用這個文件便可。
(3)設計添加新聞的表格 add.form 簡單的源代碼以下:
<form method="post" action="add.php"> //提交至 add.php
新聞標題:<input type="text" name="title" size="20"><br>
新聞內容:<textarea name="content" cols="10" rows="25"></textarea><br>
<input type="submit" name="提交">
</form>
(4)創建一個 HTML 的模板,另存爲model.htm,和 add.php能夠在同一目錄下。
示例源代碼:
<html>
<body>
此新聞的標題:{title}
此新聞的內容:{content}
</body>
</html>
{ }大括號內的內容便是要被替換的內容,整個靜態模板的設計能夠根據本身的思路,但{ }內被替換的內容必須包含在內,如上面的{title},{content};咔咔~簡單地說,設計好一個很好看的新聞模板後,把要被替換的如{title},{content}等標記放到須要的地方就能夠了撒。
(5)詳解 add.php 源碼
<?php
require_once("conn.php"); //引用conn.php,鏈接數據庫
$title=$_POST["title"];
$content=$_POST["content"]; //得到表單變量
//如下創建一文本文檔,其值自動計數
$countfile="count.txt";
if(!file_exists($countfile))
{
fopen($countfile,"w"); //若是此文件不存在,則自動創建一個
}
$fp=fopen($countfile,"r");
$num=fgets($fp,20);
$num=$num+1; //每次其值自動加一
fclose($fp);
$fp=fopen($countfile,"w");
fwrite($fp,$num); //更新其值
fclose($fp);
//利用上面自動計數的值得到HTML的路徑$path
$houzui=".html";
$path=$num.$houzui;
//這樣造成的路徑是自動增加的,如1.html,2.html,3.html……….添加一條新聞便自動加上1
//如下用SQL語句添加數據至表 news
$sql="insert into news (title,content,path) values ('".$title."','".$content."','".$path."')";
$query=mysql_query($sql);
//如下爲關鍵之處,把從表單得到的數據替換模板中的{title},{content}標記 $fp=fopen("model.htm","r") //只讀打開模板
$str=fread($fp,filesize("mode.htm"));//讀取模板中內容
$str=str_replace("{title}",$title,$str);
$str=str_replace("{content}",$content,$str);//替換內容
fclose($fp);
$handle=fopen($path,"w"); //寫入方式打開新聞路徑
fwrite($handle,$str); //把剛纔替換的內容寫進生成的HTML文件
fclose($handle);
//收尾工做:
echo "<a href=$path target=_blank>查看剛纔添加的新聞</a>";
OK,整個生成HTML的示例源碼就到這裏,其關鍵是用了替換的方法。
$str=str_replace("{被替換的內容}",$替換的內容,$str);
所以,總結一下以上的作法:先設計好新聞模板,把須要被替換的內容用{ }放到模板中相應的位置,而後設計表單,再是最後的表單處理程序,把從表單中獲取的變量替換模板中相應的內容便可,這樣每次都會生成不一樣的HTML;若是須要修改HTML的內容也是同樣的,得到修改後的表單內容後,先用 update 語句更新數據庫,再從新替換一下模板中的內容便可;刪除的話,先delete表中要刪除的內容,再用unlink($path) 來刪除HTML的物理文件便可。
********************************************************
PHP生成HTML模板實例代碼
PHP生成HTML文件mb.php和HTML模板文件mb.htm,一共2個文件。
-----------------
mb.php,若無數據,則直接echo輸出也可演示成功
<?php
/**************************/
/* 文件名 mb.php */
/*copyright www.nuskinbing.com */
/**************************/
ob_start();
$exec="select content from sql_content ";
$result = mysql_query($exec);
while($row= mysql_fetch_array($result))
{
$content=$row['content'];
echo "$content \n";
}
//若無數據庫可直接輸出 echo"www.nuskinbing.com";
$getcontent=ob_get_contents();//取得循環輸出的$content內容
ob_clean();//清除緩衝輸出
/*********** 第一次輸出內容取得完畢 ************/
ob_start();
$exec="select title from sql_title ";
$result = mysql_query($exec);
while($row= mysql_fetch_array($result))
{
$title=$row['title'];
echo "$title \n";
}
//若無數據庫可直接輸出 echo"www.nuskinbing.com";
$gettitle=ob_get_contents();//取得循環輸出的$title內容
ob_clean();//清除緩衝輸出
/******** 第二次輸出內容取得完畢 以此類推 ********/
$fp=fopen("./mb.htm","r"); //只讀打開模板
$str=fread($fp,filesize("./mb.htm"));//讀取模板中內容
$str=str_replace("{content}",$content,$str);
//將{content}替換爲$content
$str=str_replace("{title}",$title,$str);
//繼續將{title}替換爲$title
$handle=fopen("./index.htm","w+"); //寫入方式打開新聞路徑
fwrite($handle,$str); //把剛纔替換的內容寫進生成的HTML文件
fclose($handle);//完成關閉
?>
------------------------
mb.htm
<!---文件名mb.htm ----
copyright www.nuskinbing.com
----------------->
<html>
<head>
<title>{title}</title>
</head>
<body>
{content}
</body>
</html>
--來自互聯網