热烈祝贺台州朗动科技的站长论坛隆重上线!(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    浏览数:14292    发布者: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语句。客户请求为一动态文件,事实上并没有真正的文件存在在那里,是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">Matrix@Two_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">Matrix@Two_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.tzlink.com";
?>
</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 事务处理