PHP總結我的簡單靜態頁產生 過程,

來源:互聯網
上載者:User
一直用smarty的cache,但感覺還是要自己做一個,才有感覺。網上有很多牛人的功能比較完備,打算先自己搞簡單的再慢慢豐滿。這兩天做了一個比較簡單的,在hi.baidu.net/alex_wang58記錄一下。

一、用到的相關技術關鍵詞:PHP, Apache,
                                               mod_rewrite (RewriteCond,RewriteRule)地址修正,
                                               ob系列函數緩衝
                                               file_put_contents產生html

二、流程:使用者發出請求url?id=x ,判斷文章是否存在
                        (1)存在則直接轉到對應的Html頁面。
                        (2)不存在通過php讀取資料庫資料,然後產生html檔案,並存放到指定目錄。

三、實現方法:
(1)地址修正用Apahce的mod_rewrite模組中的RewriteRule指令實現重寫(mod_rewrite的開啟和簡單規則見本博另一篇http://hi.baidu.com/alex%5Fwang5 ... 0346ffb3fb952e.html )。
(2)判斷文章是否存在用Apahce 的mod_rewrite模組中的RewriteCond指令
(3)產生html檔案:
           ob_star()開啟緩衝,將讀取文章的php包含進來,然後用file_put_contents將獲得的緩衝內容寫入指定HTMl檔案。
四、代碼


/Test 目錄下的 .htaccess 檔案內容:

RewriteEngine On
RewriteRule ^index.html$ /news.php [L]
RewriteCond %{REQUEST_FILENAME}  !-s
RewriteRule ^html/news_([0-9]+).html$ getnews.php?id=$1 [L]

對news.php的訪問將通過 localhost/Test/index.html 實現由第二句 RewriteRule ^index.html$ Test/news.php [L] 實現

news.php =============================> news.php將列出文章標題連結。
複製PHP內容到剪貼簿
PHP代碼:

<?php
header("Content-Type:text/html; charset=gbk"); //以防出現亂碼
mysql_connect("localhost","root","");
mysql_query('SET NAMES gbk'); //我的資料庫用的gbk編碼,請根據自己實際情況調整
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靜態頁實現</a>
當點選連結發出對 http://localhost/Test/html/news_3.html 的請求時
Apache將會判斷 news_3.html  是否存在,由 .htaccess中的第三句
RewriteCond %{REQUEST_FILENAME}  !-s
實現:

     RewriteCond  是“定向重寫發生條件”。REQUEST_FILENAME 這個參數是“用戶端請求的檔案名稱”
' -s'  (是一個非空的常規檔案[ size]) 測試指定檔案是否存在而且是一個尺寸大於0的常規的檔案.  !表示匹配條件的反轉。
所以 RewriteCond 這句就表示當請求連結不存在時 執行下面的 RewriteRule 規則。

所以當請求的news_3.html 不存在時會重寫地址讓 getnews.php?id=3 來處理(否則如果news_3.html 存在則直接就載入該html檔案)。

getnews.php ===================>功能:判斷參數傳輸的完整性,並調用相應檔案產生html檔案。

複製PHP內容到剪貼簿
PHP代碼:

<?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 ====================> 從資料庫中讀取資料,產生新聞內容,內容被getnews.php捕獲
複製PHP內容到剪貼簿
PHP代碼:

<?php
header("Content-Type:text/html; charset=gbk");
if( isset($_GET['id']) ){
$id = & $_GET['id'];
}else{
header("Location: [url]http://127.0.0.1/lean/Test/html/news_failed.html[/url]");
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'];
}
?>


這樣將會在/Test/html 目錄下產生以 news_文章ID.html 命名的html檔案。

PS: 一開始在判斷是否存在相應html頁面時採用的是 php 內建的 file_exists() 判斷,而不用Apache的 RewriteCond,也即沒有 RewriteCond %{REQUEST_FILENAME}  !-s。看似可行,但結果會產生“迴圈重新導向”的問題。
       當news_3.html 不存在時 我們需要用 getnews.php產生news_3.html ,產生完畢後需要轉向到 news_3.html ,於是又形成了一次請求mod_rewrite又啟動把 news_3.html重寫為 getnews.php?id=3 這就形成了死迴圈了。所以把檔案存在性的判斷交給 RewriteCond ,指定的html檔案不存在時才啟用重寫規則。這樣迴圈重新導向的問題就沒有了。
       一開始沒有採用fopen開啟newsDetail.php,然後再將產生的內容fwrite成html檔案,然後include輸出靜態頁面。後來在fhjr999的提醒下,改為:將newDetail.php包含進getnews.php,通過ob系列函數將產生的內容放入緩衝,然後再產生html檔案。ob的效率是前者的20倍左右。
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.