浅谈php生成静态页面

时间:2022-11-13 08:41:56

一、引 言

 

在速度上,静态页面要比动态页面的比方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使用比较简易.

 

*****************************************************

 

1.管理后台添加记录时,直接生成目标html页面,并且前台调用连接直接指向生成的html页面。这种方法程优点是程序效率最高。

服务器负荷轻,不过由于生成的是纯静态页面,一旦页面样式(模版及css=theme)上有所改动就必须重新生成所有的内容页。

所以实际使用中应用一般不是太多。更多的是使用js,ssi,xml/xsl等客户端手段,生成的静态文件中仅保存数据,不涉及样式,

这样能达到速度和维护性的平衡,不过相对前后台程序要复杂些(应用这种方法时,由于内容为纯静态,可以搭配单独编译的纯静态的apache使用。。效率和资源占用上比包含动态内容支持的要更佳)

====

补充:

a.上面说的改动样式,要重新生成所有的内容页,可以通过:

>>>>在可以在每个生成的页面内嵌入一个<scrīptsrc=XXX.php?id=xxx&template=red></scrīpt>来判断是否需要重新生成该页面。

>>>>apache的ErrorDocument404功能,但是这里前台链接是指向html的,如果该html不存在,会通过apache的文件不存在重定向到404处理程序的功能重新生成html

(注:httpd.conf加ErrorDocument404/errprocess.php指令),利用这个功能可以解决修改网站样式的时候,要更新所有生成的html文件的问题,

将整个static文件夹删除即可。

b.通过嵌入<scrīpt></scrīpt>js来调用php的方式,更改许多需要变化的地方(如点击率之类的)

  2.前台访问链接指向php程序,php程序首先检查是否存在相应的静态文件。如果静态文件不存在。则生成并重定向至此文件,否则直接重定向。

这种方法实际使用中一般和apache的url_rewrite功能一起使用。将php的文件地址重显示为html的形式,有利于搜索引擎的检索。

这种方法在效率上略有损失,不过程序结构简单,便于调整,在访问量不是很大时使用很合适。

 

注意事项:

所有生成的html文件都集中放到一个文件夹,其中还应该注意生成文件如果很多的话(如论坛),访问其中一个htm文件,将会变得很慢,

那么最好通过

>>>>按日期来分隔文件夹,如static/2004/11/18/0001.htm

>>>>对帖子id根据数据库中字段长度做str_pad:比方说id为123456,数据库中为int(11),则id处理为00000123456,考虑到linux下一般同一下文件到达四位数会有性能影响,对其做切割,最后路径为static/00/000/123/456.html

 

 

 

 

------------------------------------------------------------------------

 

浅谈PHP生成静态页的两种方法

 

最近作的一个项目中用到了两种用PHP生成静态页面的方法,回想起当初自己还不知道如何生成静态页面的迷惘,以及看不懂高手写的文章的痛苦,觉得自己有必要站出来为还不知道如何生成静态页的phper写一个通俗点文章,以帮助他们尽快掌握这个好东西。

 

在我之前所见的文章中要不是用代码堆砌空间就是用高手与高手交流用的语言让新人望而生却。因此本文尽量把整体思路说得详尽点。

 

两种方法简单说明如下:

1. 使用文件函数得到静态页面的模板字符串,然后用str_replace函数将需要替换的东西替换了再写入到新的文件中。

2. 利用PHP的输出控制函数(Output Control)得到静态页面字符串,再写入到新的文件中。

 

下面开始详细的说明。

 

一. 利用模板生成

 

什么是模板?如果大家使用过Dreamwerver中的"另存为模板"就应该知道模板是用来统一风格的东西。它只让你修改页面的某一部分,当然这"某一部 分"是由你来确定的。本文在这说的模板也就是这个意思。(此外,PHP模板技术还包括phplib、smarty等等,这不是本文所说内容了)

 

把模板的概念结合本文再说得具体一点就是:美工先做好一个页面,然后我们把这个页面当作模板(要注意的是这个模板就没必要使用<!-- TemplateBeginEditable name="EditRegion3" -->EditRegion3<!-- TemplateEndEditable -->这样的代码了,这种代码是Dreamwerver为了方便自己设计而弄的标识),把这个模板中我们需要改变的地方用一个与HTML可以区分的 字符代替,如"{title}"、"[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' 标记。

在这一步我们的代码可以这样写:

 

CODE:[Copy to clipboard]<?php

$filemodel="template/it.php"; #模板地址

$file=fopen($filemodel,"rb"); #打开模板,得到文件指针

$temp=fread($file,filesize($filemodel)); #得到模板文件html代码

?>提醒一下:如果你只是想将一个文件的内容读入到一个字符串中,用 file_get_contents(),它的性能比fread()的代码好得多(这是手册上的原话,不过这个函数是在PHP5中支持的)。

 

第二步,使用str_replace()函数将得到的文件字符替换相关内容,替换的方法就是把从数据库中取出的内容或通过表单的得到的数据把模板中的特殊字符替换了。这一步很简单,也许刚开始想不明白,但是一看代码就一目了然了:

 

CODE:[Copy to clipboard]<?php

$temp=str_replace("[title]",$title,$temp);

?>上面的""[title]""就是模板文件中的特殊字符(是[title],不是"[title]"),"$title"就是我们想在页面上显示的内容,"$temp"就是模板文件html代码了。

 

如果还需要替换,则继续使用str_replace()函数就可以了,如:

 

CODE:[Copy to clipboard]<?php

$temp=str_replace("[postTime]",$postTime,$temp);

$temp=str_replace("[content]",$content,$temp);

?>第三步,也就是第一步的反操作了:要把之前处理过的模板字符串写入另一个文件中去,而这个文件就是我们最终可以对外显示的页面。现在重复类似第一步的二部曲:打开文件,写入文件:

 

CODE:[Copy to clipboard]<?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)

说明:这个函数不会输出内部缓冲区的内容而是把它删除!

 

精彩开始了,看看我们是如何利用输出缓冲生成静态页面的:

 

我们用函数来实现吧!

 

CODE:[Copy to clipboard]<?php

#write by yayu

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. 具体情况其他分析,在使用模板生成时由于可能直接使用表单提交的内容,所以需要过滤之类的检查。

*******************************************************

 

PHP生成静态页面

  看到很多朋友在各个地方发帖问PHP生成静态文章系统的方法,以前曾做过这样一个系统,遂谈些看法,以供各位参考。好了,我们先回顾一些基本的概念。

 

  一,PHP脚本与动态页面。

 

  PHP脚本是一种服务器端脚本程序,可通过嵌入等方法与HTML文件混合,也可以类,函数封装等形式,以模板的方式对用户请求进行处理。无论以何种方式,它的基本原理是这样的。由客户端提出请求,请求某一页面 -----> WEB服务器引入指定相应脚本进行处理 -----> 脚本被载入服务器 -----> 由服务器指定的PHP解析器对脚本进行解析形成HTML语言形式 ----> 将解析后的HTML语句以包的方式传回给浏览器。由此不难看出,在页面发送到浏览器后,PHP就不存在了,已被转化解析为HTML语句。客户请求为一动态文件,事实上并没有真正的文件存在在那里,是PHP解析而成相对应的页面,然后发送回浏览器。这种页面处理方式被称为"动态页面"。

 

  二,静态页面。

 

  静态页面是指在服务器端确实存在的仅含HTML以及JS,CSS等客户端运行脚本的页面。它的处理方式是。由客户端提出请求,请求某一页面 ----> WEB服务器确认并载入某一页面 ----> WEB服务器将该页面以包的形式传递回浏览器。由这一过程,我们对比一下动态页面,即可方现。动态页面需由WEB服务器的PHP解析器进行解析,而且通常还需连接数据库,进行数据库存取操作,然后才能形成HTML语言信息包;而静态页面,无须解析,无须连接数据库,直接发送,可大大减轻服务器压力,提高服务器负载能力,大幅提供页面打开速度和网站整体打开速度。但其缺点是,不能动态地对请求进行处理,服务器上必须确实存在该文件。

 

  三,模板及模板解析。

 

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

 

 temp.html

 

<HTML>

  <TITLE>{ title}</TITLE>

  <BODY>

   this is a { file} file's templets

  </BODY>

</HTML>

 

PHP处理:

 

 templetest.php

 

<?php

  $title = "九网互联测试模板";

  $file  = "Webjx test templet,<br>author:";

 

 $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的静态文件:

 

<?php

  $title = "九网互联测试模板";

  $file  = "Webjx test templet,<br>author:";

 

 $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处理文件中:

 

<?php

  $title = "九网互联测试模板";

  $file  = "Webjx test templet,<br>author:";

 

 $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 .= '<a href='.$root.$result['filename'].' target=_blank>'.$result['title'].'</a><br>';

  }

  $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."成功!";这句去掉,放到循环后的显示,因为该语句将中止程序执行。例:

 

<?php

$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 .= '<a href='.$root.$result['filename'].' target=_blank>'.$title.'</a><br>';

   }

     

   $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+APACHE的服务器套装,如华军软件园,去那里搜索一下就可以下载到。下载完后默认安装即可,这样您就具备了在本地测试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生成HTML模板实例代码

PHP生成HTML文件mb.php和HTML模板文件mb.htm,一共2个文件。

-----------------

mb.php,若无数据,则直接echo输出也可演示成功

 

<?php

/**************************/

/* 文件名 mb.php */

/*copyright www.nuskinbing.com */

/**************************/

ob_start();

$exec="select content from sql_content ";

$result = mysql_query($exec);

while($row= mysql_fetch_array($result))

{

$content=$row['content'];

echo "$content \n";

}

//若无数据库可直接输出 echo"www.nuskinbing.com";

$getcontent=ob_get_contents();//取得循环输出的$content内容

ob_clean();//清除缓冲输出

/*********** 第一次输出内容取得完毕 ************/

 

ob_start();

$exec="select title from sql_title ";

$result = mysql_query($exec);

while($row= mysql_fetch_array($result))

{

$title=$row['title'];

echo "$title \n";

}

//若无数据库可直接输出 echo"www.nuskinbing.com";

$gettitle=ob_get_contents();//取得循环输出的$title内容

ob_clean();//清除缓冲输出

/******** 第二次输出内容取得完毕 以此类推 ********/

 

$fp=fopen("./mb.htm","r"); //只读打开模板

$str=fread($fp,filesize("./mb.htm"));//读取模板中内容

$str=str_replace("{content}",$content,$str);

//将{content}替换为$content

$str=str_replace("{title}",$title,$str);

//继续将{title}替换为$title

$handle=fopen("./index.htm","w+"); //写入方式打开新闻路径

fwrite($handle,$str); //把刚才替换的内容写进生成的HTML文件

fclose($handle);//完成关闭

?>

 

------------------------

 

mb.htm

 

<!---文件名mb.htm ----

copyright www.nuskinbing.com

----------------->

<html>

<head>

<title>{title}</title>

</head>

<body>

{content}

</body>

</html>

--来自互联网