熱烈祝賀臺州維博網絡的站長論壇隆重上線!(2012-05-28)    熱烈慶祝偉大的祖國60周年生日 點擊進來我們一起為她祝福吧(2009-09-26)    站長論壇禁止發布廣告,一經發現立即刪除。謝謝各位合作!.(2009-08-08)    熱烈祝賀臺州網址導航全面升級,全新版本上線!希望各位一如既往地支持臺州網址導航的發展.(2009-03-28)    臺州站長論壇恭祝各位新年快樂,牛年行大運!(2009-01-24)    臺州Link正式更名為臺州網址導航,專業做以臺州網址為主的網址導航!(2008-05-23)    熱烈祝賀臺州Link資訊改名為中國站長資訊!希望在以后日子里得到大家的大力支持和幫助!(2008-04-10)    熱烈祝賀臺州Link論壇改名為臺州站長論壇!希望大家繼續支持和鼓勵!(2008-04-10)    臺州站長論壇原[社會瑣碎]版塊更名為[生活百科]版塊!(2007-09-05)    特此通知:新臺州站長論壇的數據信息全部升級成功!">特此通知:新臺州站長論壇的數據信息全部升級成功!(2007-09-01)    臺州站長論壇對未通過驗證的會員進行合理的清除,請您諒解(2007-08-30)    臺州網址導航|上網導航誠邀世界各地的網站友情鏈接和友誼聯盟,共同引領網站導航、前進!(2007-08-30)    禁止發廣告之類的帖,已發現立即刪除!(2007-08-30)    希望各位上傳與下載有用資源和最新信息(2007-08-30)    熱烈祝賀臺州站長論壇全面升級成功,全新上線!(2007-08-30)    
便民網址導航,輕松網上沖浪。
臺州維博網絡專業開發網站門戶平臺系統
您當前的位置: 首頁 » PHP/Perl編程 » 談PHP生成靜態頁面(二)

談PHP生成靜態頁面(二)

論壇鏈接
  • 談PHP生成靜態頁面(二)
  • 發布時間:2007-10-05 15:56:31    瀏覽數:7612    發布者:tznktg    設置字體【   
一、引 言

在速度上,靜態頁面要比動態頁面的比方php快很多,這是毫無疑問的,但是由于靜態頁面的靈活性較差,如果不借助數據庫或其他的設備保存相關信息的話,整體的管理上比較繁瑣,比方修改編輯.比方閱讀權限限制等,但是,對應一些我們經常頻頻使用的文件,比方說,開發的新聞發布系統,我們不希望很多用戶都讀取數據庫才顯示結果,這樣一方面消耗了服務器的資源,另一方面占去了瀏覽者大量可貴的響應時間,所有,有了"靜態頁面話"的做法,當前很多網站都采用這種技術,一般都是由管理后臺控制,或者生成html直接顯示,或者xhtml用css控制顯示,或者生成xml用xslt顯示,這些技術都不是難的,在這里我就淺顯的說說生成html的方法.

二、預備知識

模板技術:

[PHP] 模板引擎Smarty深入淺出介紹 --2005-12-31
[PHP] 笑談配置,使用Smarty技術 --2006-01-04

緩存技術:

有些信息比方經常不變的,但是還是能變的信息放在緩存中以加快顯示速度,這是很有價值的,所謂的緩存,通俗的理解就是一些保存在服務器端的共用信息.它是于服務器同生死的,我們在保存緩存的時候可以指定下次更新的時間的判斷,比方要在5分鐘更新一次,可以記錄上次更新的時間,和當前時間比較,如果大于 5 分鐘 ,讀取數據庫,更新換成,否則直接讀取緩存數據,當然,緩存需要客戶端用戶激活的,只需一次.

ob_start()函數:打開輸出緩沖區.
函數格式 void ob_start(void)
說明:當緩沖區激活時,所有來自PHP程序的非文件頭信息均不會發送,而是保存在內部緩沖區。為了輸出緩沖區的內容,可以使用ob_end_flush()或flush()輸出緩沖區的內容。

Flush:刷新緩沖區的內容,輸出。
函數格式:flush()
說明:這個函數經常使用,效率很高。

ob_get_contents :返回內部緩沖區的內容。
函數格式:string ob_get_contents(void)
說明:這個函數會返回當前緩沖區中的內容,如果輸出緩沖區沒有激活,則返回 FALSE.

ob_get_length:返回內部緩沖區的長度。
函數格式:int ob_get_length(void)
說明:這個函數會返回當前緩沖區中的長度;和ob_get_contents一樣,如果輸出緩沖區沒有激活,則返回 FALSE.

ob_end_clean:刪除內部緩沖區的內容,并且關閉內部緩沖區
函數格式:void ob_end_clean(void)
說明:這個函數不會輸出內部緩沖區的內容而是把它刪除

ob_end_flush:發送內部緩沖區的內容到瀏覽器,并且關閉輸出緩沖區
函數格式:void ob_end_flush(void)
說明:這個函數發送輸出緩沖區的內容(如果有的話)

ob_implicit_flush:打開或關閉絕對刷新
函數格式:void ob_implicit_flush ([int flag])
說明:默認為關閉緩沖區,打開絕對輸出后,每個腳本輸出都直接發送到瀏覽器,不再需要調用 flush()

文件寫入:

int fwrite ( resource handle, string string [, int length] )
fwrite() 把 string 的內容寫入 文件指針 handle 處。 如果指定了 length,當寫入了 length 個字節或者寫完了 string 以后,寫入就會停止,視乎先碰到哪種情況。
fwrite() 返回寫入的字符數,出現錯誤時則返回 FALSE 。
相關參考官方網站: 文件參考

三、解決方案

思路:開啟 ob_start緩沖,當已經調出數據的時候獲取 ob_get_contents,然后生成靜態頁,ob_end_clean清除緩沖.ok,就這么來,來看一個例子(php+mysql的結合):

創建數據庫:

CREATE TABLE `bihtml` (
`id` int(11) NOT NULL auto_increment,
`szdtitle` varchar(16) NOT NULL,
`szdcontent` text NOT NULL,
PRIMARY KEY (`id`)
) TYPE=MyISAM;
獲取當前的ID,并導入模板:

ob_start();
$id=_POST['id']
if(!isset($id)&&is_integer($id))
{
@$db=new mysqli('localhost','root','admin','bihtml');
$result=$db->fetch_one_array("select * from szd_bi where id='$id'");
if(!empty($result))
{
$tmp->assign(array(
"Szdtitle",htmlspecialchars($result['titles']),
"Szdcontent",$result['titles']));
}
$tpl->display('default_1.tpl');
$this_my_f= ob_get_contents(); //此處關鍵
ob_end_clean();
$filename = "$id.html";
if(tohtmlfile_cjjer($filename,$this_my_f))
echo "生成成功 $filename";
else
echo "生成識別";
}
}

//把生成文件的過程寫出函數
function tohtmlfile_cjjer($file_cjjer_name,$file_cjjer_content)
{
if (is_file ($file_cjjer_name)){
@unlink ($file_cjjer_name);
}
$cjjer_handle = fopen ($file_cjjer_name,"w");
if (!is_writable ($file_cjjer_name)){
return false;
}
if (!fwrite ($cjjer_handle,$file_cjjer_content)){
return false;
}
fclose ($cjjer_handle); //關閉指針
return $file_cjjer_name;
}

四、說明事項

1: 一般建議管理員添加數據的時候就生成靜態頁面,可以考慮記錄生成的文件名次和路徑.

2: php主要是 ob_starts()和 ob_get_contents,生成靜態頁面的時候很有用,當然也可以考慮調出數據庫直接替換模板里面的變量也是可以的.

3: 主要的模板使用smarty,phplib都是可以的,smarty使用比較簡易.
      剛好這次的項目需要這個啊理論知識....挺好啊
      <?php
//////////////////////////////////////////////////////////////////////////////////////////////////////////
//File: tohtml.php
//Author: TZNKTG
//Purpose: This page is php code information to html code information
///////////////////////////////////////////////////////////////////////////////////////////////////////////

require("include/dbfun.php");
require("include/common_var.php");

?>

<html>
<head><title><? echo $logotitle ?>-生成HTML廣告</title>
<meta http-equiv="content-type" content="text/html; charset=gb2312">
<link href="css/15hr.css" type="text/css" rel="stylesheet">
<script language="javascript">
<!--
function check()
{
if(document.tohtml.position.value=="")
{
alert("請您輸入廣告位置!");
document.tohtml.position.focus();
return false;
}

else
{
return true;
}
}
-->
</script>
</head>
<body>
<?php
if(!$_POST['tohtml'])
{
?>
<table width="755" border="0" align="center" cellpadding="0" cellspacing="0">
<tr valign="top">
<td width="186" valign="top" background="images/middle.gif">
<?php
//左邊菜單欄//
require("left.php");
?>
</td>
<td width="15"></td>
<td rowspan="2" valign="top">
<table cellspacing=0 cellpadding=0 width="100%" align="center" border=0>
<tbody>
<tr>
<td width="5"><img src="images/main_top_left.gif" width="5" height="5" border="0"></td>
<td width="100%" background="images/main_top_center.gif" height="5"></td>
<td width="5"><img src="images/main_top_right.gif" width="5" height="5" border="0"></td>
</tr>
</tbody>
</table>
<table class="main_bg" cellspacing="0" cellpadding="0" width="100%" border="0" align="center">
<tbody>
<tr height="5"><td></td></tr>
<tr valign="top">
<td> <img src="images/link_arrow.gif"> 服務器當前時間: <? echo $nowdt ?>
<br><br></td>
</tr>
<tr>
<td>
<form action="tohtml.php" method="post" name="tohtml">
<table width='95%' border='0' cellspacing='0' cellpadding='0' align='center'>
<tr height="25"><td></td></tr>
<tr bgcolor="EEEEEE">
<td height="30" align="center" colspan="2">添加一網廣告信息</td>
</tr>
<tr bgcolor="FFFFFF">
<td height="30" width="20%" align="center">人才站點:</td>
<td height="30" width="80%" align="left">
<select name="hrsite">
<?php echo hrsitefun() ?>
</select> <font color="#FF0000">*</font>(請您選擇<font color="#FF0000">人才站點</font>的廣告位置)<font color="#FF0000">*</font></td>
</tr>
<tr bgcolor="EEEEEE">
<td height="30" width="20%" align="center">廣告位置:</td>
<td height="30" width="80%" align="left"><input type="text" id="position" name="position" size="15" maxlength="15"> <font color="#FF0000">*</font>(請您填寫<font color="#FF0000">只能為數字</font>的廣告位置)<font color="#FF0000">*</font></td>
</tr>
<tr bgcolor="FFFFFF">
<td height="30" align="center" colspan="2"><input type='submit' name='tohtml' value='立即生成HTML' onclick="return check()"></td>
</tr>
<tr height="50"><td></td></tr>
</table>
</form>
</td>
</tr>
</tbody>
</table>
<table cellspacing="0" cellpadding="0" width="100%" align="center" border="0">
<tbody>
<tr>
<td width="5"><img src="images/main_bot_left.gif" width="5" height="5" border="0"></td>
<td width="100%" background="images/main_bot_center.gif" height=5></td>
<td width="5"><img src="images/main_bot_right.gif" width="5" height="5" border="0"></td>
</tr>
</tbody>
</table>
</td>
</tr>
<tr>
<td valign="bottom" background="images/middle.gif"><img height="5" src="images/bottom.gif" width="190"></td>
</tr>
</table>
<? }
else
{ //===========================開始處==================================//
ob_end_clean();
ob_start();
$datelog = date("Y-m-d H:i:s"); //日期時間日志;
$hrsite_id = htmlspecialchars($_POST['hrsite']);
$pos_id = htmlspecialchars($_POST['position']);
$hrsite_name = $hrsite_array{$hrsite_id};
$select_posid_sql = "select * from ".$info_table." where position=".$pos_id." and onoff=1 and hrsite like '%".$hrsite_name."%' order by orderid asc";
$db->execute($select_posid_sql);
$num=$db->countnum();
//echo $num;
if($pos_id==1)
{
$htmls.='<table cellSpacing="0" cellPadding="0" align="left" border="0">';
$htmls.='<tbody>';
$htmls.='<tr>';
$htmls.='<td>';
$htmls.='<div align="left">';
$htmls.='<table cellSpacing="7" cellPadding="0" border="0">';
$htmls.='<tbody>';
$htmls.='<tr>';
$trnum=0;
while($logoinfo_result=$db->reader())
{
$compid = $logoinfo_result['compid'];
$compname = $logoinfo_result['compname'];
$imgurl = $logoinfo_result['imgurl'];
$cellnum = $logoinfo_result['cellnum'];

if($cellnum==1)
{
$colspan="";
}
else
{
$colspan=" colspan=\"".$cellnum."\"";
}

$trnum+=$cellnum;

if($trnum%5!=0)
{
$htmls.='<td valign="top" height="38"'.$colspan.'><a href="http://www.15hr.com/Qixia/taizhou/Info_invite_show.php?id='.$compid.'" target="_blank"><img src="'.$imgurl.'" title="'.$compname.'" height="33" border="0"></a></td>';

}
else
{
$htmls.='<td valign="top" height="38"'.$colspan.'><a href="http://www.15hr.com/Qixia/taizhou/Info_invite_show.php?id='.$compid.'" target="_blank"><img src="'.$imgurl.'" title="'.$compname.'" height="33" border="0"></a></td></tr>';
}
}

$htmls.='</tbody></table>';
$htmls.='</div></td></tr>';
$htmls.='</tbody></table>';
}
else if($pos_id==2)
{
$htmls.='<table cellSpacing="0" cellPadding="0" width="230" border="0" align="right">';
$htmls.='<tbody>';
while($logoinfo_result=$db->reader())
{
$compid = $logoinfo_result['compid'];
$compname = $logoinfo_result['compname'];
$imgurl = $logoinfo_result['imgurl'];
$htmls.='<tr>';
$htmls.='<td vAlign="top" height="38"><a href="http://www.15hr.com/Qixia/taizhou/Info_invite_show.php?id='.$compid.'" target="_blank"><img src="'.$imgurl.'" title="'.$compname.'" height="33" width="230" border="0"></a></td>';
$htmls.='</tr>';
}
$htmls.='</tbody>';
$htmls.='</table>';

}
else if($pos_id==3)
{
$htmls.='<table cellSpacing="0" cellPadding="0" align="right" border="0">';
$htmls.='<tbody>';
$htmls.='<tr>';
$htmls.='<td>';
$htmls.='<div align="right">';
$htmls.='<table cellSpacing="7" cellPadding="0" border="0">';
$htmls.='<tbody>';
$htmls.='<tr>';
$trnum=0;
while($logoinfo_result=$db->reader())
{
$compid = $logoinfo_result['compid'];
$compname = $logoinfo_result['compname'];
$imgurl = $logoinfo_result['imgurl'];
$cellnum = $logoinfo_result['cellnum'];

if($cellnum==1)
{
$colspan="";
}
else
{
$colspan=" colspan=\"".$cellnum."\"";
}

$trnum+=$cellnum;

if($trnum%2!=0)
{
$htmls.='<td valign="top" height="38"'.$colspan.'><a href="http://www.15hr.com/Qixia/taizhou/Info_invite_show.php?id='.$compid.'" target="_blank"><img src="'.$imgurl.'" title="'.$compname.'" height="33" border="0"></a></td>';

}
else
{
$htmls.='<td valign="top" height="38"'.$colspan.'><a href="http://www.15hr.com/Qixia/taizhou/Info_invite_show.php?id='.$compid.'" target="_blank"><img src="'.$imgurl.'" title="'.$compname.'" height="33" border="0"></a></td></tr>';
}
}

$htmls.='</tbody></table>';
$htmls.='</div></td></tr>';
$htmls.='</tbody></table>';
}
else if($pos_id==4)
{
$htmls.='<table border="0" cellspacing="0" cellpadding="0">';
$htmls.='</tbody>';
$htmls.='<div align="left">';
$htmls.='<tr><td><img src="../images/left_toplogo.gif"></td></tr>';
while($logoinfo_result=$db->reader())
{
//$compid = $logoinfo_result['compid'];
//$compname = $logoinfo_result['compname'];
$imgurl = $logoinfo_result['imgurl'];

$htmls.='<tr bgcolor="#F7F7F7">';
$htmls.='<td height="70" align="center"><img src="'.$imgurl.'" width="148" height="60" style="border:1px solid #cccccc"></td>';
$htmls.='</tr>';
}
$htmls.='</div>';
$htmls.='</tbody>';
$htmls.='</table>';

}

echo $htmls;
$content = ob_get_contents();
writeover("html/".$hrsite_id."_pos".$pos_id.".html",$content);
unset($content);
ob_end_clean();

echo "<script language='javascript'>window.alert('您已經于 ".$datelog." 生成".$hrsite_id."_pos".$pos_id.".html 成功!');location.href='tohtml.php';</script>";
//===========================結束處==================================//
}
?>
</body>
</html>
      我們先回顧一些基本的概念。

  一,PHP腳本與動態頁面。

  PHP腳本是一種服務器端腳本程序,可通過嵌入等方
法與HTML文件混合,也可以類,函數封裝等形式,以模板的方式對用戶請求進行處理。無論以何種方式,它的基本原理是這樣的。由客戶端提出請求,請求某一頁面 -----> WEB服務器引入指定相應腳本進行處理 -----> 腳本被載入服務器 -----> 由服務器指定的PHP解析器對腳本進行解析形成HTML語言形式 ----> 將解析后的HTML語句以包的方式傳回給瀏覽器。由此不難看出,在頁面發送到瀏覽器后,PHP就不存在了,已被轉化解析為HTML語句?蛻粽埱鬄橐粍討B文件,事實上并沒有真正的文件存在在那里,是PHP解析而成相對應的頁面,然后發送回瀏覽器。這種頁面處理方式被稱為“動態頁面”。

  二,靜態頁面。

  靜態頁面是指在服務器端確實存在的僅含HTML以及JS,CSS等客戶端運行腳本的頁面。它的處理方式是。由客戶端提出請求,請求某一頁面 ----> WEB服務器確認并載入某一頁面 ----> WEB服務器將該頁面以包的形式傳遞回瀏覽器。由這一過程,我們對比一下動態頁面,即可方現。動態頁面需由WEB服務器的PHP解析器進行解析,而且通常還需連接數據庫,進行數據庫存取操作,然后才能形成HTML語言信息包;而靜態頁面,無須解析,無須連接數據庫,直接發送,可大大減輕服務器壓力,提高服務器負載能力,大幅提供頁面打開速度和網站整體打開速度。但其缺點是,不能動態地對請求進行處理,服務器上必須確實存在該文件。

  三,模板及模板解析。

  模板即尚未填充內容html文件。例如:



 temp.html



Code:
<HTML>
<TITLE>{ title }</TITLE>
<BODY>
this is a { file } file''s templets
</BODY>
</HTML>



PHP處理:

 templetest.php


Code:
$title = "HP愛好者測試模板";
$file = "TwoMax Inter test templet,
author:Sheyi";

 $fp = fopen ("temp.html","r");
$content = fread ($fp,filesize ("temp.html"));
$content .= str_replace ("{ file }",$file,$content);
$content .= str_replace ("{ title }",$title,$content);

echo $content;
?>




  模板解析處理,即將經PHP腳本解析處理后得出的結果填充(content)進模板的處理過程。通常借助于模板類。目前較流行的模板解析類有phplib,smarty,fastsmarty等等。模板解析處理的原理通常為替換。也有些程序員習慣將判斷,循環等處理放進模板文件中,用解析類處理,典型應用為block概念,簡單來說即為一個循環處理。由PHP腳本指定循環次數,如何循環代入等,再由模板解析類具體實施這些操作。


  好了,對比過靜態頁面與動態頁面各自的優劣,現在我們就來說說,如何用PHP生成靜態文件。


  PHP生成靜態頁面并不是指PHP的動態解析,輸出HTML頁面,而是指用PHP創建HTML頁面。同時因為HTML的不可寫性,我們創建的HTML若有修改,則需刪掉重新生成即可。(當然你也可以選擇用正則進行修改,但個人認為那樣做倒不如刪掉重新生成來得快捷,有些得不償失。)

  言歸正傳。用過PHP文件操作函數的PHP FANS知道,PHP中有一個文件操作函數fopen,即打開文件。若文件不存在,則嘗試創建。這即是PHP可以用來創建HTML文件的理論基礎。只要用來存放HTML文件的文件夾有寫權限(即權限定義0777),即可創建文件。(針對UNIX系統而言,Win系統無須考慮。)仍以上例為例,若我們修改最后一句,并指定在test目錄下生成一個名為test.html的靜態文件:


Code:
$title = "拓邁國際測試模板";
$file = "TwoMax Inter test templet,
author:_Max">[email protected]_Max";

 $fp = fopen ("temp.html","r");
$content = fread ($fp,filesize ("temp.html"));
$content .= str_replace ("{ file }",$file,$content);
$content .= str_replace ("{ title }",$title,$content);

// echo $content;

$filename = "test/test.html";
$handle = fopen ($filename,"w"); //打開文件指針,創建文件
/*
 檢查文件是否被創建且可寫
*/
if (!is_writable ($filename)){
die ("文件:".$filename."不可寫,請檢查其屬性后重試!");
}
if (!fwrite ($handle,$content)){ //將信息寫入文件
die ("生成文件".$filename."失!");
}
fclose ($handle); //關閉指針

die ("創建文件".$filename."成功!");
?>



  實際應用中常見問題解決方案參考:

  一,文章列表問題:
  
  在數據庫中創建字段,記錄文件名,每生成一個文件,將自動生成的文件名存入數據庫,對于推薦文章,只需指向存放靜態文件的指定文件夾中的該頁面即可。利用PHP操作處理文章列表,存為字符串,生成頁面時替換此字符串即可。如,在頁面中放置文章列表的表格加入標記{ articletable },而在PHP處理文件中:


Code:
$title = "拓邁國際測試模板";
$file = "TwoMax Inter test templet,
author:_Max">[email protected]_Max";

 $fp = fopen ("temp.html","r");
$content = fread ($fp,filesize ("temp.html"));
$content .= str_replace ("{ file }",$file,$content);
$content .= str_replace ("{ title }",$title,$content);

// 生成列表開始
$list = '''';
$sql = "select id,title,filename from article";
$query = mysql_query ($sql);
while ($result = mysql_fetch_array ($query)){
$list .= ''''.$result[''title''].''
'';
}
$content .= str_replace ("{ articletable }",$list,$content);

//生成列表結束
// echo $content;

$filename = "test/test.html";
$handle = fopen ($filename,"w"); //打開文件指針,創建文件
/*
 檢查文件是否被創建且可寫
*/
if (!is_writable ($filename)){
die ("文件:".$filename."不可寫,請檢查其屬性后重試!");
}
if (!fwrite ($handle,$content)){ //將信息寫入文件
die ("生成文件".$filename."失!");
}
fclose ($handle); //關閉指針

die ("創建文件".$filename."成功!");
?>




  二,分頁問題。

  如我們指定分頁時,每頁20篇。某子頻道列表內文章經數據庫查詢為45條,則,首先我們通過查詢得到如下參數:1,總頁數;2,每頁篇數。第二步,for ($i = 0; $i < allpages; $i++),頁面元素獲取,分析,文章生成,都在此循環中執行。不同的是,die ("創建文件".$filename."成功!";這句去掉,放到循環后的顯示,因為該語句將中止程序執行。例:


Code:
$fp = fopen ("temp.html","r");
$content = fread ($fp,filesize ("temp.html"));
$onepage = ''20'';
$sql = "select id from article where channel=''$channelid''";
$query = mysql_query ($sql);
$num = mysql_num_rows ($query);
$allpages = ceil ($num / $onepage);

for ($i = 0;$i<$allpages; $i++){
if ($i == 0){
$indexpath = "index.html";
} else {
$indexpath = "index_".$i."html";
}
$start = $i * $onepage;
$list = '''';
$sql_for_page = "select name,filename,title from article where channel=''$channelid'' limit $start,$onepage";
$query_for_page = mysql_query ($sql_for_page);
while ($result = $query_for_page){
$list .= ''''.$title.''
'';
}

$content = str_replace ("{ articletable }",$list,$content);

if (is_file ($indexpath)){
@unlink ($indexpath); //若文件已存在,則刪除
}

$handle = fopen ($indexpath,"w"); //打開文件指針,創建文件
/*
  檢查文件是否被創建且可寫
*/
if (!is_writable ($indexpath)){
echo "文件:".$indexpath."不可寫,請檢查其屬性后重試!"; //修改為echo
}
if (!fwrite ($handle,$content)){ //將信息寫入文件
echo "生成文件".$indexpath."失!"; //修改為echo
}
fclose ($handle); //關閉指針
}

fclose ($fp);
die ("生成分頁文件完成,如生成不完全,請檢查文件權限系統后重新生成!");

?>
 大致思路如此,其中如其它數據生成,數據輸入輸出檢查,分頁內容指向等可酌情在頁面中加入。

  在實際文章系統處理過程當中,還有許多問題有待考慮,與動態頁面不同之處,需注意的地方還有很多。但大致思路即是如此,其它方面可舉一反三而得。
      前言:

目前網絡上好多網站的新聞發布系統都采用了動態服務器技術生成靜態HTML的做法,這樣做的好處是:一是能減輕其服務器的負擔,二是因為生成了HTML靜態頁面,所以其網站被搜索引擎搜索到的機率更大一些。筆者的網站曾經使用PHP這一動態技術來構建新聞發布系統,其原理也就是應用了PHP生成HTML靜態頁面的技術,相關平臺是 Windows XP Sp2+php4.32+mysql,因此,在這里,想簡單地談一下這種做法的思路。這篇文章適合于對PHP+MYSQL數據庫操作,SQL語句以及網頁設計有點基礎的朋友,如果您是一個從頭開始學的朋友,那么請先打好基礎吧!到這里就不用往下看了。如果您都符合上述條件的話,那么恭喜您,請接著往下看。但是,在具體動手構建之前,您還要做好以下幾點準備工作。

一、 具備本地調試PHP的功能

在WINDOWS XP操作系統下,筆者建議你可以到網上下載一個PHP+MYSQL+APHCHE的服務器套裝,如華軍軟件園,去那里搜索一下就可以下載到。下載完后默認安裝即可,這樣您就具備了在本地測試PHP的功能了,省去了很多手動配置的麻煩,怎么樣,簡單吧,OK,這僅僅只是第一步。

二、 構思新聞發布系統所具備的功能

首頁的新聞發布往往是通過后臺更新的,后臺的更新無非是由添加、編輯、刪除數據等基本的功能所實現的。在這里,你可以使用網頁設計軟件來構建你的想要的后臺界面,其功能的實現當然是要用到PHP嘍。這一步建議您先想好新聞發布系統要有的功能。在這里,如何用PHP添加、編輯、刪除數據就不再重復,因為重點是如何在這基礎上生成靜態技術。

三、 PHP生成HTML的技術原理。

哈哈。費話說了那么多,終于到了該講的地方了。其實,這一原理并不復雜,綜合地來講的話,應該是PHP中一個替換數據語法的應用。OK,講一個簡單范例吧,一步一步地分析!相信聰明的你能看得明白的咯,仔細看好每一步即可,在這里,只是引導大家如何做而已,具體的可以實踐一下!

(1)在MYSQL里新建一數據庫,命名為 database (可自定義),新建一表,命名為 news(因為是新聞發布嘛,取個好記的名字即可,可自定義),然后建立這幾個字段名:
id (自動遞增,這是關鍵,類型:INT)
title (顧名思義,新聞標題,類型可取 TEXT)
content (新聞內容,類型可取 TEXT)
path (HTML文件路徑,類型可取 TEXT)

(2)建立 conn.php
這是連接數據庫的PHP文件,你可以把連接數據的語句單獨放在這一文件里,以后多個需要連接數據庫的文件直接引用這個文件即可。

(3)設計添加新聞的表格 add.form 簡單的源代碼如下:

以下是代碼片段,把《》換成<>:

《form method=”post” action=”add.php”> //提交至 add.php
新聞標題:<input type=”text” name=”title” size=”20”><br>
新聞內容:<textarea name=”content” cols=”10” rows=”25”></textarea><br>
《input type=”submit” name=”提交”》
《/form》



(4)建立一個 HTML 的模板,另存為model.htm,和 add.php可以在同一目錄下。
示例源代碼:
以下是代碼片段,把《》換成<>:

《html>
《body>
此新聞的標題:{title}
此新聞的內容:{content}
《/body>
《/html>
{ }大括號內的內容即是要被替換的內容,整個靜態模板的設計可以根據自己的思路,但{ }內被替換的內容必須包含在內,如上面的{title},{content};咔咔~簡單地說,設計好一個很好看的新聞模板后,把要被替換的如{title},{content}等標記放到需要的地方就可以了撒。

(5)詳解 add.php 源碼

以下是代碼片段,把《》換成<>:

《?php
require_once(“conn.php”); //引用conn.php,連接數據庫
$title=$_POST[“title”];
$content=$_POST[“content”]; //獲得表單變量

//以下建立一文本文檔,其值自動計數
$countfile="count.txt";
if(!file_exists($countfile))
{
fopen($countfile,"w"); //如果此文件不存在,則自動建立一個
}
$fp=fopen($countfile,"r");
$num=fgets($fp,20);
$num=$num+1; //每次其值自動加一
fclose($fp);
$fp=fopen($countfile,"w");
fwrite($fp,$num); //更新其值
fclose($fp);



//利用上面自動計數的值獲得HTML的路徑$path
$houzui=”.html”;
$path=$num.$houzui;
//這樣形成的路徑是自動增長的,如1.html,2.html,3.html……….添加一條新聞便自動加上1

//以下用SQL語句添加數據至表 news

以下是代碼片段,把《》換成<>:
$sql=”insert into news (title,content,path) values (‘”.$title.”’,’”.$content.”’,’”.$path.”’)”;
$query=mysql_query($sql);


//以下為關鍵之處,把從表單獲得的數據替換模板中的{title},{content}標記

以下是代碼片段,把《》換成<>:
$fp=fopen(“model.htm”,”r”) //只讀打開模板
$str=fread($fp,filesize(“mode.htm”));//讀取模板中內容
$str=str_replace(“{title}”,$title,$str);
$str=str_replace(“{content}”,$content,$str);//替換內容
fclose($fp);

$handle=fopen($path,”w”); //寫入方式打開新聞路徑
fwrite($handle,$str); //把剛才替換的內容寫進生成的HTML文件
fclose($handle);



//收尾工作:

以下是代碼片段,把《》換成<>:
echo “<a href=$path target=_blank>查看剛才添加的新聞</a>”;


OK,整個生成HTML的示例源碼就到這里,其關鍵是用了替換的方法。
$str=str_replace(“{被替換的內容}”,$替換的內容,$str);

因此,總結一下以上的做法:先設計好新聞模板,把需要被替換的內容用{ }放到模板中相應的位置,然后設計表單,再是最后的表單處理程序,把從表單中獲取的變量替換模板中相應的內容即可,這樣每次都會生成不同的HTML;如果需要修改HTML的內容也是一樣的,獲得修改后的表單內容后,先用 update 語句更新數據庫,再重新替換一下模板中的內容即可;刪除的話,先delete表中要刪除的內容,再用unlink($path) 來刪除HTML的物理文件即可。
      <?php
function CreateShtml()
{
ob_start("callback_CteateShtml");
}
function callback_CteateShtml($buffer)
{
$page = intval(@$_REQUEST["page"]);
//$fileName = $_SERVER['DOCUMENT_ROOT'] . dirname($_SERVER['PHP_SELF']) . "/article/" . basename($_SERVER['PHP_SELF'],".php") . ($page==0 ? "" : "_" . strval($page)) . ".html";
$fileName = basename($_SERVER['PHP_SELF'],".php") . ($page==0 ? "" : "_" . strval($page)) . ".html";//可以在這里修改你的靜態頁面路徑
$fp = fopen($fileName,"wb");
fwrite($fp,$buffer);
fclose($fp);
return $buffer;
}
?>



舉個例
把上面的代碼保存為 static.php
執行下面頁面 phpfans.php
CODE:[復制到剪切板]<?php
include("static.php");
CreateShtml();
?>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>無標題文檔</title>
</head>

<body>
<?php
echo "php愛好者站歡迎你,http://www.673734.live";
?>
</body>
</html>


將會生成一個 phpfans.html的靜態頁面

如果有參數,則用page來傳遞 如 phpfans.php?page=1
則生成 phpfans_1.html的靜態頁面
娛樂休閑專區A 影視預告B 音樂咖啡C 英語階梯D 生活百科
網頁編程專區E AMPZF HTMLG CSSH JSI ASPJ PHPK JSPL MySQLM AJAX
Linux技術區 N 系統管理O 服務器架設P 網絡/硬件Q 編程序開發R 內核/嵌入
管理中心專區S 發布網址T 版主議事U 事務處理
陕西快乐10分玩法 终于破了11选5出号规律 澳门正规赌场平台 极速赛车开奖记录 广西十一选五中奖规则 福彩快3正规平台 壹点顺配资 江西多乐彩开奖走势 幸运农场中6个多少钱 36选7好彩3投注技巧 哪个投资理财平台可靠