兩種方法簡單說明如下:
1.使用檔案函式得到靜態頁面的模板字串,然後用str_replace函式將需要替換的東西替換了再寫入到新的檔案中。
2. 利用php的輸出控制函式(output control)得到靜態頁面字串,再寫入到新的檔案中。
下面開始詳細的說明。
一.利用模板生成
什麼是模板?如果大家使用過dreamwerver中的「另存為模板」就應該知道模板是用來統一風格的東西。它只讓你修改頁面的某一部分,當然這「某一部分」是由你來確定的。本文在這說的模板也就是這個意思。(此外,php模板技術還包括phplib、smarty等等,這不是本文所說內容了)
把模板的概念結合本文再說得具體一點就是:美工先做好乙個頁面,然後我們把這個頁面當作模板(要注意的是這個模板就沒必要使用editregion3這樣的**了,這種**是dreamwerver為了方便自己設計而弄的標識),把這個模板中我們需要改變的地方用乙個與html可以區分的字元代替,如「」、「[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' 標記。
在這一步我們的**可以這樣寫:
<?php
$filemodel="template/it.php"; #模板位址
$file=fopen($filemodel,"rb"); #開啟模板,得到檔案指標
$temp=fread($file,filesize($filemodel)); #得到模板檔案html**
提醒一下:如果你只是想將乙個檔案的內容讀入到乙個字串中,用 file_get_contents(),它的效能比fread()的**好得多(這是手冊上的原話,不過這個函式是在php5中支援的)。
<?php
$temp=str_replace("[title]",$title,$temp);
上面的「"[title]"」就是模板檔案中的特殊字元(是[title],不是」[title]」),「$title」就是我們想在頁面上顯示的內容,「$temp」就是模板檔案html**了。
如果還需要替換,則繼續使用str_replace()函式就可以了,如:
<?php
$temp=str_replace("[posttime]",$posttime,$temp);
$temp=str_replace("[content]",$content,$temp);
第三步,也就是第一步的反操作了:要把之前處理過的模板字串寫入另乙個檔案中去,而這個檔案就是我們最終可以對外顯示的頁面。現在重複類似第一步的二部曲:開啟檔案,寫入檔案:
<?php
fwrite(fopen("$filename","wb"),$temp); #$filename是靜態頁面的檔名
fwrite的作用就是把字串的內容寫入檔案中去了。
同樣,也可以使用file_put_contents函式寫檔案,但記得是在php5中。
這樣,我們就可以用模板生成靜態頁面了。
二.利用輸出控制函式(output control)生成靜態頁面
這個與用模板生成的相比相對高階一點,但一旦明白了它的實現思路,卻是簡單無比,所謂會者不難,難者不會大概就是這麼一回事吧。
這種方法比模板生成的方法應用面更大。使用模板生成方法一般用於發表或修改文章時使用,這樣的話資料庫可以直接從表單得到,就無須通過資料庫了。當如果需要從資料庫取出資料,並且替換的東西比較多,更或者你需要的頁面並不僅僅是通過簡單的替換就能得到的,比如說站點的首頁。這時,就有必要考慮使用輸出控制函式了。
輸出控制函式的作用是設定緩衝區,在緩衝區裡面輸出的內容可以被獲得。獲得輸出內容整個過程只需要使用三個函式便可以了:ob_start()、ob_get_contents()、ob_end_clean()
方法思路如下:設定緩衝區起點(或設定輸出內容的起點)──釋放內容──取得內容──清空緩衝區──把取得的內容寫如檔案。
1、ob_start :開啟輸出緩衝區
函式格式:void ob_start(void)
說明:當緩衝區啟用時,所有來自php程式的非檔案頭資訊均不會傳送,而是儲存在內部緩衝區。
為了輸出緩衝區的內容,可以使用ob_end_flush()或flush()輸出緩衝區的內容。
2 、ob_get_contents :返回內部緩衝區的內容。
使用方法:string ob_get_contents(void)
說明:這個函式會返回當前緩衝區中的內容,如果輸出緩衝區沒有啟用,則返回 false 。
3、ob_end_clean:刪除內部緩衝區的內容,並且關閉內部緩衝區
使用方法:void ob_end_clean(void)
說明:這個函式不會輸出內部緩衝區的內容而是把它刪除!
精彩開始了,看看我們是如何利用輸出緩衝生成靜態頁面的:
我們用函式來實現吧!
<?php
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.具體情況其他分析,在使用模板生成時由於可能直接使用表單提交的內容,所以需要過濾之類的檢查。
子集生成的兩種方法
該演算法來自 劉汝佳的演算法競賽入門經典。書中介紹了兩種演算法的核心 但卻沒有逐過程詳細解說,另初學者看文字時很難看懂,遇到問題,是先要直接研究問題的細節呢還是先把問題搞清楚?我認為絕對應該先學習如何去解決問題,構造方法的框架,而不是先去研究細節。方法一 思路 一次選出乙個元素放到集合中 cpp v...
子集生成的兩種方法
該演算法來自 劉汝佳的演算法競賽入門經典。書中介紹了兩種演算法的核心 但卻沒有逐過程詳細解說,另初學者看文字時很難看懂,遇到問題,是先要直接研究問題的細節呢還是先把問題搞清楚?我認為絕對應該先學習如何去解決問題,構造方法的框架,而不是先去研究細節。方法一 思路 一次選出乙個元素放到集合中 cpp v...
php生成靜態頁
先建立一chtml資料庫 表名稱為bihtml create table bihtml id int 11 auto increment not null,szdtitle varchar 30 szdcontent text primary key id 在表中插入兩條記錄 insert into...