作者:iwind
原来在dev-club发表的一篇文章,将怎么用模板处理程序PHPlib 中的template.inc实现静态网页的生成,呵呵,居然被列入精华,并被多个网站转载,想来这是荣幸。其实网上这方面的东西很多了,我上此发布的所谓IAMS( iwind 文章管理系统),里面也有,有心人可以看一下。下面我只是简要在总结一次。
现在一般说生成静态网页的方法有三种,一个是配置服务器,大家可以到http://www.devarticles.com/c/b/PHP/ 去找找看,对于这个很多地方都有的。另外一个是用ob_函数控制输出。方法如下:先用ob_start();打开输出缓冲器,然后是对数据的分析,操作等等,跟着用ob_get_contents();获取缓冲区的内容,然后再写入文件。根据这个步骤,可以写出以下程序:
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();
}
第一个函数是结果保存到静态文件中,第二个是把所有的模板分析变量都置为空,以免批量处理时相互影响。
二,实现静态网页生成。
$itpl->set_file(“main”,”mian.tpl”);
//分析模板变量
…..
//分析mainmains
$tpl->parse("mains","main");
//把分析结果mains存入main.html
$tpl->savetofile("main.html","mains");
//置空
$tpl->renew();//至关重要
?>
呵呵,是不是很簡單,main.html就是我們要的內容。下面是一個結合資料庫的例子,並用函數封裝了起來。
//$aid是資料庫中的文章id,$table是表名稱,$template是模板位址,$tpl是template.inc的一個實例
//每一個aid對應一個靜態網頁位址,都存在一個資料表中
//表格的結構類似aid target title
// 2 a2.html ….
/ / 3 a3.html ….
function staticInfo($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()把我們想要處理的任一篇文章都產生靜態網頁。裡面也可以包含文章內容,作者,來源等等,方法是一樣的。時候,只要把對應的靜態網頁重新產生一次即可。靜態網頁的關鍵所在就是$template(模板位址),$target(目標位址)。 ,時分秒3,根據文章id。是非常簡單的。
require”functions.php”;
//一些變數的定義
$template=”template/info.tpl”;
$tpl=new Template(“.”); //連接mysql,選擇資料庫
mysql_connect(“localhost”,”root',””);
//發送查詢語句
$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程式碼,來達到計數,即時更新等目的。 (完)