用libTemplate實現靜態網頁的產生_php基礎

來源:互聯網
上載者:User

作者:iwind

原來在dev-club發表的一篇文章,將怎麼用模板處理常式PHPlib 中的template.inc實現靜態網頁的產生,呵呵,居然被列入精華,並被多個網站轉載,想來這是榮幸。其實網上這方面的東西很多了,我上此發布的所謂IAMS( iwind 文章管理系統),裡面也有,有心人可以看一下。下面我只是簡要在總結一次。

現在一般說產生靜態網頁的方法有三種,一個是設定管理員,大家可以到http://www.devarticles.com/c/b/PHP/ 去找找看,對於這個很多地方都有的。另外一個是用ob_函數控制輸出。方法如下:先用ob_start();開啟輸出緩衝器,然後是對資料的分析,操作等等,跟著用ob_get_contents();擷取緩衝區的內容,然後再寫入檔案。根據這個步驟,可以寫出以下程式:
   <?php
   ob_start();
   //主體部分,資料操作,處理,輸出等等。。。
   require”global.php”;
   mysql_connect(“localhost”,”root”,””);
   …..
   //擷取緩衝區內容
   $contents=ob_get_contents();
   //如果不想輸出任何東西,可以加上這句
   ob_end_clean();
   //寫入目的檔案
   $fp=@fopen($targetFile,”w+”) or die(“開啟檔案時出錯”);
   fwrite($fp,$contents);
?>

這樣就把這個動態網頁面的內容寫入了靜態頁面,$targetFile.像有的網站首頁內容很多,要調用n多個查詢語句時,不妨定時產生靜態網頁,既大幅提高了訪問速度,也減輕了伺服器負擔。

你可以看出來,我用ob_只是處理單個頁面,對於批量寫入或更新多個頁面,這個方法就不行了。這就是我要講的第三種方法,用模板。模板是個好東東,現在大家都或多或少在用它,建議還不會簡單模板處理的網友,花點時間去學它,一般的模板處理常式都很簡單的。用模板實現靜態網頁的產生是非常簡單的,方法就是擷取分析結果,把分析結果寫入檔案。下面就以PHPlib中的template.inc來談談如果用模板產生靜態網頁。

一, 修改template.inc
加入以下的幾個函數:
//將分析結果儲存到檔案中去
  function savetofile ($dir,$varname){
   $data=$this->finish($this->get_var($varname));
   $fp=fopen($dir,"w+");
   fwrite($fp,$data);
  }
  //清除已賦值數組
   function renew(){
    $this->varkeys=array();
    $this->varvals=array();
    $this->file=array();
    }

第一個函數是結果儲存到靜態檔案中,第二個是把所有的模板分析變數都置為空白,以免批量處理時相互影響。

二,實現靜態網頁產生。
<?php
$itpl->set_file(“main”,”mian.tpl”);
//分析模板變數
…..
//分析mainmains
$tpl->parse("mains","main");
//把分析結果mains存入main.html
$tpl->savetofile("main.html","mains");
//置空
$tpl->renew();//至關重要
?>

呵呵,是不是很簡單,main.html就是我們要的內容。下面是一個結合資料庫的例子,並用函數封裝了起來。
<?php
//$aid是資料庫中的文章id,$table是表名稱,$template是模板地址,$tpl是template.inc的一個執行個體
//每一個aid對應一個靜態網頁地址,都存在一個資料表中
//表的結構類似於 aid     target       title
//                1     a1.html     ….
//                2     a2.html     ….
//                3     a3.html     ….
function staticInfo($aid){
   global $table,$template,$tpl;
   //查詢資料庫
   $res=mysql_query(“select * from $table where aid='$aid'”);
   //取出資料
   $array=mysql_fetch_array($res);
   //讀靜態網頁地址,標題。
   $target=$array[“target”];
$title=$array[“title”];
//分析模板
$tpl->set_file(“main”,$template);
//把模板中的{title}變數換成$title
$itpl->set_var(“title”,$title”);
//分析整個模板
$itpl->set_var(“mains”,”main”);
//把mains寫入檔案
$tpl->savetofile($target,"mains");
//置空
$tpl->renew();
}
?>

這樣我們就可以用函數staticInfo()把我們想要處理的任一篇文章都產生靜態網頁。表$target裡也可以包含文章內容,作者,來源等等,方法是一樣的。

三,更新靜態網頁
一篇文章加入資料庫後,由於一些原因我們總要修改一些文章。這時候,只要把相應的靜態網頁重建一次即可。這是非常方便的,因為表中已經有了靜態網頁的目標地址target欄位。

可以看出關鍵所在,一篇文章產生靜態網頁的關鍵所在就是$template(模板地址),$target(目標地址)。前者,我們可以先確定,後者可以由你隨心所欲的為每篇文章設定一個地址。常用的有1,時間戳記 2,時分秒 3,根據文章id。因為這些重複的機會會非常小的。

四,批量產生靜態網頁.
有了單個文章產生的靜態網頁的函數了,那麼批量產生是非常簡單的。就是擷取所有的文章aid,然後套入函數即可。
<?php
  //引用模板類
require”template.inc”;
//引入函數
require”functions.php”;
//一些變數的定義
$table=”art”;
$template=”template/info.tpl”;
$tpl=new Template(“.”);
  //串連mysql,選擇資料庫
mysql_connect(“localhost”,”root',””);
mysql_select_db(“article”);
//發送查詢語句
$res=mysql_query(“select aid from $table”);
while($r=mysql_fetch_array($res)){
   $aid=$r[“aid”];
   //產生靜態網頁
   staticInfo($aid);
}
//結束
echo”所有靜態網頁更新/產生成功”;
?>

上面就是完整的例子。我們做cms的流程可以如下:
1,記者發稿(把稿件內容放入資料庫)
2,編輯審查(如果他認為發行就緒,那麼就可以把這些內容產生靜態網頁)
3,退回稿件(把產生的靜態網頁刪除,把資料庫中的內容刪除)

然後,我們訪問到的網站內容就都是靜態了。一個問題就是,這種方法會不會佔用很多空間內?http://www.knowsky.com 有上千篇文章了,只佔用了20M空間。反過來說,如果你有10000篇文章的話,你不會吝嗇到只買200M的空間吧?

或許你對產生靜態文章列表感到困惑,其實方法是一樣的,就是 計算頁碼 分析每個頁碼的內容  寫入檔案。 分析每個頁碼的內容,當然是寫個函數咯,如果你一頁一頁的產生,恐怕被人嘲笑 ^_^。

靜態網頁不僅僅是可以減輕伺服器負擔,提高訪問速度,也可以方便地做鏡像網站,方便地備份,減少被攻擊損失程度,加快還原速度。當然靜態網頁也會給大家帶來諸多不便的地方,你需要在動態和靜態之間做出平衡,也可以在靜態網頁中加入js調用的php代碼,來達到計數,即時更新等目的。(完)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.