php簡(jiǎn)單靜態(tài)頁(yè)生成過(guò)程
更新時(shí)間:2008年03月27日 22:36:49 作者:
一直用smarty的cache,但感覺(jué)還是要自己做一個(gè),才有感覺(jué)。網(wǎng)上有很多牛人的功能比較完備,打算先自己搞簡(jiǎn)單的再慢慢豐滿。這兩天做了一個(gè)比較簡(jiǎn)單的,在hi.baidu.net/alex_wang58記錄一下。
一、用到的相關(guān)技術(shù)關(guān)鍵詞:PHP, Apache,
mod_rewrite (RewriteCond,RewriteRule)地址重寫,
ob系列函數(shù)緩沖
file_put_contents生成html
二、流程:用戶發(fā)出請(qǐng)求url?id=x ,判斷文章是否存在
(1)存在則直接轉(zhuǎn)到對(duì)應(yīng)的Html頁(yè)面。
(2)不存在通過(guò)php讀取數(shù)據(jù)庫(kù)數(shù)據(jù),然后生成html文件,并存放到指定目錄。
三、實(shí)現(xiàn)方法:
(1)地址重寫用Apahce的mod_rewrite模塊中的RewriteRule指令實(shí)現(xiàn)重寫(mod_rewrite的開啟和簡(jiǎn)單規(guī)則見(jiàn)本博另一篇http://hi.baidu.com/alex%5Fwang5 ... 0346ffb3fb952e.html )。
(2)判斷文章是否存在用Apahce 的mod_rewrite模塊中的RewriteCond指令
(3)生成html文件:
ob_star()打開緩沖,將讀取文章的php包含進(jìn)來(lái),然后用file_put_contents將獲得的緩沖內(nèi)容寫入指定HTMl文件。
四、代碼
/Test 目錄下的 .htaccess 文件內(nèi)容:
RewriteEngine On
RewriteRule ^index.html$ /news.php [L]
RewriteCond %{REQUEST_FILENAME} !-s
RewriteRule ^html/news_([0-9]+).html$ getnews.php?id=$1 [L]
對(duì)news.php的訪問(wèn)將通過(guò) localhost/Test/index.html 實(shí)現(xiàn)由第二句 RewriteRule ^index.html$ Test/news.php [L] 實(shí)現(xiàn)
news.php =============================> news.php將列出文章標(biāo)題鏈接。
<?php
header("Content-Type:text/html; charset=gbk"); //以防出現(xiàn)亂碼
mysql_connect("localhost","root","");
mysql_query('SET NAMES gbk'); //我的數(shù)據(jù)庫(kù)用的gbk編碼,請(qǐng)根據(jù)自己實(shí)際情況調(diào)整
mysql_select_db("test");
$sql = "Select `id`,`title` FROM `arc` order by `id` DESC";
$rs = mysql_query($sql);
while($row = mysql_fetch_array($rs) ){
echo "<a href='/Test/html/news_$row[id].html'>$row[title]</a><br>";
}
?>
比如生成了<a href='/Test/html/news_3.html'>php靜態(tài)頁(yè)實(shí)現(xiàn)</a>
當(dāng)點(diǎn)擊鏈接發(fā)出對(duì) http://localhost/Test/html/news_3.html 的請(qǐng)求時(shí)
Apache將會(huì)判斷 news_3.html 是否存在,由 .htaccess中的第三句
RewriteCond %{REQUEST_FILENAME} !-s
實(shí)現(xiàn):
RewriteCond 是“定向重寫發(fā)生條件”。REQUEST_FILENAME 這個(gè)參數(shù)是“客戶端請(qǐng)求的文件名”
'-s' (是一個(gè)非空的常規(guī)文件[size]) 測(cè)試指定文件是否存在而且是一個(gè)尺寸大于0的常規(guī)的文件. !表示匹配條件的反轉(zhuǎn)。
所以 RewriteCond 這句就表示當(dāng)請(qǐng)求鏈接不存在時(shí) 執(zhí)行下面的 RewriteRule 規(guī)則。
所以當(dāng)請(qǐng)求的news_3.html 不存在時(shí)會(huì)重寫地址讓 getnews.php?id=3 來(lái)處理(否則如果news_3.html 存在則直接就加載該html文件)。
getnews.php ===================>功能:判斷參數(shù)傳輸?shù)耐暾?,并調(diào)用相應(yīng)文件生成html文件。
<?php
$id =$_GET['id'];
$root =& $_SERVER['DOCUMENT_ROOT'];
$filename = "news_".$id.".html";
$file = $root."/Test/html/".$filename;
ob_start();
include($root."/Test/newsDetail.php");
file_put_contents($file,ob_get_contents());
ob_end_flush();
?>
newsDetail.php ====================> 從數(shù)據(jù)庫(kù)中讀取數(shù)據(jù),產(chǎn)生新聞內(nèi)容,內(nèi)容被getnews.php捕獲
<?php
header("Content-Type:text/html; charset=gbk");
if( isset($_GET['id']) ){
$id = & $_GET['id'];
}else{
header("Location: http://127.0.0.1/lean/Test/html/news_failed.html");
exit();
}
mysql_connect("localhost","root","");
mysql_query('SET NAMES gbk');
mysql_select_db("test");
$id =$_GET['id'];
$sql = "Select `news` FROM `arc` Where `id`=$id";
$rs = mysql_query($sql);
while($row = mysql_fetch_array($rs) ){
echo $row['news'];
}
?>
這樣將會(huì)在/Test/html 目錄下產(chǎn)生以 news_文章ID.html 命名的html文件。
PS: 一開始在判斷是否存在相應(yīng)html頁(yè)面時(shí)采用的是 php 內(nèi)置的 file_exists() 判斷,而不用Apache的 RewriteCond,也即沒(méi)有 RewriteCond %{REQUEST_FILENAME} !-s??此瓶尚校Y(jié)果會(huì)產(chǎn)生“循環(huán)重定向”的問(wèn)題。
當(dāng)news_3.html 不存在時(shí) 我們需要用 getnews.php生成news_3.html ,生成完畢后需要轉(zhuǎn)向到 news_3.html ,于是又形成了一次請(qǐng)求mod_rewrite又啟動(dòng)把 news_3.html重寫為 getnews.php?id=3 這就形成了死循環(huán)了。所以把文件存在性的判斷交給 RewriteCond ,指定的html文件不存在時(shí)才啟用重寫規(guī)則。這樣循環(huán)重定向的問(wèn)題就沒(méi)有了。
一開始沒(méi)有采用fopen打開newsDetail.php,然后再將生成的內(nèi)容fwrite成html文件,然后include輸出靜態(tài)頁(yè)面。后來(lái)在fhjr999的提醒下,改為:將newDetail.php包含進(jìn)getnews.php,通過(guò)ob系列函數(shù)將生成的內(nèi)容放入緩沖,然后再生成html文件。ob的效率是前者的20倍左右。
mod_rewrite (RewriteCond,RewriteRule)地址重寫,
ob系列函數(shù)緩沖
file_put_contents生成html
二、流程:用戶發(fā)出請(qǐng)求url?id=x ,判斷文章是否存在
(1)存在則直接轉(zhuǎn)到對(duì)應(yīng)的Html頁(yè)面。
(2)不存在通過(guò)php讀取數(shù)據(jù)庫(kù)數(shù)據(jù),然后生成html文件,并存放到指定目錄。
三、實(shí)現(xiàn)方法:
(1)地址重寫用Apahce的mod_rewrite模塊中的RewriteRule指令實(shí)現(xiàn)重寫(mod_rewrite的開啟和簡(jiǎn)單規(guī)則見(jiàn)本博另一篇http://hi.baidu.com/alex%5Fwang5 ... 0346ffb3fb952e.html )。
(2)判斷文章是否存在用Apahce 的mod_rewrite模塊中的RewriteCond指令
(3)生成html文件:
ob_star()打開緩沖,將讀取文章的php包含進(jìn)來(lái),然后用file_put_contents將獲得的緩沖內(nèi)容寫入指定HTMl文件。
四、代碼
/Test 目錄下的 .htaccess 文件內(nèi)容:
RewriteEngine On
RewriteRule ^index.html$ /news.php [L]
RewriteCond %{REQUEST_FILENAME} !-s
RewriteRule ^html/news_([0-9]+).html$ getnews.php?id=$1 [L]
對(duì)news.php的訪問(wèn)將通過(guò) localhost/Test/index.html 實(shí)現(xiàn)由第二句 RewriteRule ^index.html$ Test/news.php [L] 實(shí)現(xiàn)
news.php =============================> news.php將列出文章標(biāo)題鏈接。
復(fù)制代碼 代碼如下:
<?php
header("Content-Type:text/html; charset=gbk"); //以防出現(xiàn)亂碼
mysql_connect("localhost","root","");
mysql_query('SET NAMES gbk'); //我的數(shù)據(jù)庫(kù)用的gbk編碼,請(qǐng)根據(jù)自己實(shí)際情況調(diào)整
mysql_select_db("test");
$sql = "Select `id`,`title` FROM `arc` order by `id` DESC";
$rs = mysql_query($sql);
while($row = mysql_fetch_array($rs) ){
echo "<a href='/Test/html/news_$row[id].html'>$row[title]</a><br>";
}
?>
比如生成了<a href='/Test/html/news_3.html'>php靜態(tài)頁(yè)實(shí)現(xiàn)</a>
當(dāng)點(diǎn)擊鏈接發(fā)出對(duì) http://localhost/Test/html/news_3.html 的請(qǐng)求時(shí)
Apache將會(huì)判斷 news_3.html 是否存在,由 .htaccess中的第三句
RewriteCond %{REQUEST_FILENAME} !-s
實(shí)現(xiàn):
RewriteCond 是“定向重寫發(fā)生條件”。REQUEST_FILENAME 這個(gè)參數(shù)是“客戶端請(qǐng)求的文件名”
'-s' (是一個(gè)非空的常規(guī)文件[size]) 測(cè)試指定文件是否存在而且是一個(gè)尺寸大于0的常規(guī)的文件. !表示匹配條件的反轉(zhuǎn)。
所以 RewriteCond 這句就表示當(dāng)請(qǐng)求鏈接不存在時(shí) 執(zhí)行下面的 RewriteRule 規(guī)則。
所以當(dāng)請(qǐng)求的news_3.html 不存在時(shí)會(huì)重寫地址讓 getnews.php?id=3 來(lái)處理(否則如果news_3.html 存在則直接就加載該html文件)。
getnews.php ===================>功能:判斷參數(shù)傳輸?shù)耐暾?,并調(diào)用相應(yīng)文件生成html文件。
復(fù)制代碼 代碼如下:
<?php
$id =$_GET['id'];
$root =& $_SERVER['DOCUMENT_ROOT'];
$filename = "news_".$id.".html";
$file = $root."/Test/html/".$filename;
ob_start();
include($root."/Test/newsDetail.php");
file_put_contents($file,ob_get_contents());
ob_end_flush();
?>
newsDetail.php ====================> 從數(shù)據(jù)庫(kù)中讀取數(shù)據(jù),產(chǎn)生新聞內(nèi)容,內(nèi)容被getnews.php捕獲
復(fù)制代碼 代碼如下:
<?php
header("Content-Type:text/html; charset=gbk");
if( isset($_GET['id']) ){
$id = & $_GET['id'];
}else{
header("Location: http://127.0.0.1/lean/Test/html/news_failed.html");
exit();
}
mysql_connect("localhost","root","");
mysql_query('SET NAMES gbk');
mysql_select_db("test");
$id =$_GET['id'];
$sql = "Select `news` FROM `arc` Where `id`=$id";
$rs = mysql_query($sql);
while($row = mysql_fetch_array($rs) ){
echo $row['news'];
}
?>
這樣將會(huì)在/Test/html 目錄下產(chǎn)生以 news_文章ID.html 命名的html文件。
PS: 一開始在判斷是否存在相應(yīng)html頁(yè)面時(shí)采用的是 php 內(nèi)置的 file_exists() 判斷,而不用Apache的 RewriteCond,也即沒(méi)有 RewriteCond %{REQUEST_FILENAME} !-s??此瓶尚校Y(jié)果會(huì)產(chǎn)生“循環(huán)重定向”的問(wèn)題。
當(dāng)news_3.html 不存在時(shí) 我們需要用 getnews.php生成news_3.html ,生成完畢后需要轉(zhuǎn)向到 news_3.html ,于是又形成了一次請(qǐng)求mod_rewrite又啟動(dòng)把 news_3.html重寫為 getnews.php?id=3 這就形成了死循環(huán)了。所以把文件存在性的判斷交給 RewriteCond ,指定的html文件不存在時(shí)才啟用重寫規(guī)則。這樣循環(huán)重定向的問(wèn)題就沒(méi)有了。
一開始沒(méi)有采用fopen打開newsDetail.php,然后再將生成的內(nèi)容fwrite成html文件,然后include輸出靜態(tài)頁(yè)面。后來(lái)在fhjr999的提醒下,改為:將newDetail.php包含進(jìn)getnews.php,通過(guò)ob系列函數(shù)將生成的內(nèi)容放入緩沖,然后再生成html文件。ob的效率是前者的20倍左右。
您可能感興趣的文章:
- php生成靜態(tài)頁(yè)面的簡(jiǎn)單示例
- 基于PHP生成靜態(tài)頁(yè)的實(shí)現(xiàn)方法
- 比較詳細(xì)PHP生成靜態(tài)頁(yè)面教程
- 用php的ob_start來(lái)生成靜態(tài)頁(yè)面的方法分析
- php文章內(nèi)容分頁(yè)并生成相應(yīng)的htm靜態(tài)頁(yè)面代碼
- 談PHP生成靜態(tài)頁(yè)面分析 模板+緩存+寫文件
- 方便實(shí)用的PHP生成靜態(tài)頁(yè)面類(非smarty)
- PHP生成HTML靜態(tài)頁(yè)面實(shí)例代碼
- 生成靜態(tài)頁(yè)面的PHP類
- PHP動(dòng)態(tài)頁(yè)生成靜態(tài)頁(yè)的3種常用方法
相關(guān)文章
php實(shí)現(xiàn)圖片轉(zhuǎn)換成ASCII碼的方法
這篇文章主要介紹了php實(shí)現(xiàn)圖片轉(zhuǎn)換成ASCII碼的方法,涉及php操作圖片的技巧,需要的朋友可以參考下2015-04-04基于PHP實(shí)現(xiàn)棧數(shù)據(jù)結(jié)構(gòu)和括號(hào)匹配算法示例
這篇文章主要介紹了基于PHP實(shí)現(xiàn)棧數(shù)據(jù)結(jié)構(gòu)和括號(hào)匹配算法,結(jié)合實(shí)例形式分析了php數(shù)組操作實(shí)現(xiàn)棧數(shù)據(jù)結(jié)構(gòu)的進(jìn)棧、出棧,以及基于棧的括號(hào)匹配應(yīng)用技巧,需要的朋友可以參考下2017-08-08PHP正則表達(dá)式處理函數(shù)(PCRE 函數(shù))實(shí)例小結(jié)
這篇文章主要介紹了PHP正則表達(dá)式處理函數(shù)(PCRE 函數(shù)),結(jié)合實(shí)例形式總結(jié)分析了php正則表達(dá)式preg_replace、preg_match、preg_match_all、preg_split及preg_quote等函數(shù)相關(guān)使用技巧,需要的朋友可以參考下2019-05-05php使用sql數(shù)據(jù)庫(kù) 獲取字段問(wèn)題介紹
由于sql server中,ntext和nvarchar字段是用unicode編碼存儲(chǔ)內(nèi)容的,因此php通過(guò)mssql擴(kuò)展讀取帶ntext和nvarchar類型字段的時(shí)候會(huì)抱錯(cuò)2013-08-08PHP下利用shell后臺(tái)運(yùn)行PHP腳本,并獲取該腳本的Process ID的代碼
PHP下利用shell后臺(tái)運(yùn)行PHP腳本,并獲取該腳本的Process ID的代碼,學(xué)習(xí)php的朋友可以參考下。2011-09-09PHP基于數(shù)組實(shí)現(xiàn)的分頁(yè)函數(shù)實(shí)例
這篇文章主要介紹了PHP基于數(shù)組實(shí)現(xiàn)的分頁(yè)函數(shù)實(shí)例,是非常實(shí)用的一個(gè)技巧,需要的朋友可以參考下2014-08-08