看到很多朋友在各個地方發文問PHP生成靜態文章系統的方法,以前曾做過這樣一個系統,遂談些看法,以供各位參考。兄弟連PHP訓練先帶大家回顧一些基本的概念。
一,PHP腳本與動態頁。
PHP腳本是一種伺服器端腳本程序,可透過嵌入等方法與HTML檔案混合,也可以類,函數封裝等形式,以範本的方式對使用者請求進行處理。無論以何種方式,它的基本原理是這樣的。由客戶端提出請求,請求某一頁面-----> WEB伺服器引入指定對應腳本進行處理-----> 腳本被載入伺服器-----> 由伺服器指定的PHP解析器對腳本進行解析形成HTML語言形式----> 將解析後的HTML語句以包的方式傳回給瀏覽器。由此不難看出,在頁面傳送到瀏覽器後,PHP就不存在了,已轉換解析為HTML語句。客戶請求為一動態文件,事實上並沒有真正的文件存在在那裡,是PHP解析而成相對應的頁面,然後發送回瀏覽器。這種頁面處理方式稱為「動態頁面」。
二,靜態頁。
靜態頁面是指在伺服器端確實存在的僅含HTML以及JS,CSS等客戶端運行腳本的頁面。它的處理方式是。由客戶端提出請求,請求某一頁面 ----> WEB伺服器確認並載入某一頁面 ----> WEB伺服器將該頁面以包的形式傳回瀏覽器。由此過程,我們比較一下動態頁面,即可方現。動態頁面需由WEB伺服器的PHP解析器進行解析,而且通常還需連接資料庫,進行資料庫存取操作,然後才能形成HTML語言資訊包;而靜態頁面,無須解析,無須連接資料庫,直接傳送,可大大減輕伺服器壓力,提高伺服器負載能力,大幅提供頁面開啟速度和網站整體開啟速度。但其缺點是,不能動態地對請求進行處理,伺服器上必須確實存在該文件。
三,模板及模板解析。
範本即尚未填入內容html檔案。例如:
temp.html
PHP處理:
templetest.php hu.com測試範本";
$file = "TwoMax Inter test templet,
author:Matrix@Two_Max";
$fp = fopen ("temp.html","r");
$content = fread ($fp,filesize (.html"); $content = str_replace ("{ file }",$file,$content);
$content = str_replace ("{ title }",$title,$content);
『echo $contentcontent;模板解析處理,即將經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的靜態檔案:
$ title = "http://siyizhu.com測試範本";
$file = "TwoMax Inter test templet,
author:Matrix@Two_Max";
$fp = fopen" ;
$content = fread ($fp,filesize ("temp.html"));
$content = str_replace ("{file}",$file,$content);
$content = str_replace ("{title}",$title,$content);
// echo $content;
$filename = "test/test.html"; open
『 w"); //開啟檔案指針,建立檔案
/*
檢查檔案是否已建立且可寫
*/ > :" .$filename."不可寫,請檢查其屬性後重試!");
}
if (!fwrite ($handle,$content)){ //將資訊寫入檔案。文件".$filename."失敗!");
}
fclose ($handle); //關閉指針
〜>
實際應用中常見問題解決方案參考:
一,文章列表問題:
在資料庫中建立字段,記錄檔名,每產生一個文件,將自動產生的文件名稱存入資料庫,對於推薦文章名稱需指向存放靜態文件的指定資料夾中的該頁面即可。利用PHP操作處理文章列表,存為字串,生成頁面時替換此字串即可。如,在頁面中放置文章清單的表格加入標記{articletable},而在PHP處理文件中:
$title = "http://siyizhu.com測試範本"TwoMax Inter test templet,
author:Matrix@Two_Max";
$fp = fopen ("temp.html","r");
$content = fread ($ftemp)size ($ftemp.html" );
$content = str_replace ("{file}",$file,$content);
$content = str_replace ("{title}",$title,$content);
$list = '';
$sql = "select id,title,filename from article";
$query = mysql_query ($5); ){
$list .= ''.$result['title'].'
';
}
$content .= str_replace ("{articletable}",$list,$content);
// echo $content;
$filename = "test/test.html";
.檢查檔案是否已建立且可寫
*/
if (!is_writable ($filename)){
die ("檔案:".$filename."不可寫,請檢查其屬性後不寫;
}
if (!fwrite ($handle,$content)){ //將資訊寫入檔案
die close ($handle); //關掉指標
die ("建立檔案".$filename."成功!");
?>
二,分頁問題。
如我們指定分頁時,每頁20篇。某子頻道清單內文章經資料庫查詢為45條,則,首先我們透過查詢得到以下參數:1,總頁數;2,每頁篇數。第二步,for ($i = 0; $i
$fp = fopen ("temp.html","r");
$content = fread ($fp,filesize ("temp.html"));
$onepage = '20';
$onepage = '20';
$onepage = '20';com from article where channel='$channelid'";
$query = mysql_query ($sql);
$num = mys_num_rows ($query);
for ($i = 0;$i
if ($i == 0){
$indexpath = "index.html"; 🎀 ".$i."html";
}
$start = $i * $onepage;
$list = '';sqlforspage,$ channelid' limit $start,$onepage";
$query_for_page = mysql_query ($sql_for_page);
while ($result = $query_for_page){
$list .= ''.$title.'
';
} _re if (is_file ($indexpath)){
@unlink ($indexpath); //若檔案已存在,則刪除
}
$handle = fphandle = fopen"); ,建立檔案
/*
檢查文件是否已建立且可寫
*/
不可寫,請檢查其屬性後重試!"; //修改為echo
}
if (!fwrite ($handle,$content)){ //將訊息寫入檔案生成失敗!"; //修改為echo
}
fclose ($handle); //關閉指針
close 🀜 ($7㠎〜);如生成不完全,請檢查檔案權限系統後重新生成!");
?>
大致思路如此,其中如其它數據生成,數據輸入輸出檢查,分頁內容指向等可酌情在頁面中加入。
在實際文章系統處理過程當中,還有許多問題有待考慮,www.lampbrother.net 與動態頁面不同之處,需注意的地方還有很多。但大致思路即是如此,其它方面可舉一反三而得。