浅谈php生成静态页面,生成静态html文件

2019-10-03 16:03 来源:未知

由于这段时日相当的轻巧,于是想到比比较多的营业所网址,音讯网址须求将页面静态化,于是写了个封装类来实现静态文件的生成,思路相比较轻便,但未全面,网上朋友可依据自个儿的思路将该类扩展,运用了简易工厂格局(本来刚初叶看设计形式,是个好书),好了,废话非常少说,先来看看静态类的父类:StaticBase(抽象类)

一、引 言

 1 public abstract class StaticBase : IDisposable
 2     {
 3         /// <summary>
 4         /// 默认编码方式
 5         /// </summary>
 6         protected Encoding code = Encoding.GetEncoding("utf-8");
 7         /// <summary>
 8         /// 写入页面数据流
 9         /// </summary>
10         protected StreamWriter sw = null;
11         /// <summary>
12         /// 读取页面数据流
13         /// </summary>
14         protected StreamReader sr = null;
15         /// <summary>
16         /// 生成的静态页面保存文件夹路径
17         /// </summary>
18         protected string SavePath = "/Default/";
19         /// <summary>
20         /// 模板页面的文件夹路径
21         /// </summary>
22         protected string PagePath = "/Master/";
23         public abstract bool Osucess { set; get; }
24         public abstract string Errorstring { set; get; }
25         /// <summary>
26         /// 具体生成静态方法
27         /// </summary>
28         protected abstract bool WriteFile();
29         /// <summary>
30         /// 不同模块的文件名称
31         /// </summary>
32         protected Dictionary<FlagsFileName, string> FileName
33         {
34             get
35             {
36                 return new Dictionary<FlagsFileName, string>
37                 {
38                     {FlagsFileName.News,"article"},
39                     {FlagsFileName.head,"head"},
40                     {FlagsFileName.foot,"foot"},
41                 };
42             }
43         }
44        // http://www.cnblogs.com/roucheng/
45         #region IDisposable 成员
46 
47         public void Dispose()
48         {
49             sw.Dispose();
50             sr.Dispose();
51         }
52 
53         #endregion
54     }
55     #region 对应的页面名称
56     /// <summary>
57     /// 对应的页面名称
58     /// </summary>
59     public enum FlagsFileName : byte
60     {
61         /// <summary>
62         /// 新闻
63         /// </summary>
64         [Description("新闻")]
65         News = 0,
66         /// <summary>
67         /// 头部
68         /// </summary>
69         [Description("头部")]
70         head=1,
71         /// <summary>
72         /// 脚部
73         /// </summary>
74         [Description("脚部")]
75         foot=2,
76     }

 

最后的一个枚举用于定义分裂地方或不一样类型的静态页所对应的子类

在进度上,静态页面要比动态页面的假诺php快相当多,那是迟早的,可是出于静态页面包车型地铁狡滑很糟糕,固然不借助数据库或其余的设施保存有关新闻的话,全体的田间管理上比较麻烦,比如修改编辑.举个例子阅读权限限制等,不过,对应一些我们日常不断利用的文本,举例说,开采的音信宣布类别,大家不期望多多客商都读取数据库才展现结果,这样一方面消耗了服务器的能源,另一方面占去了浏览者多量金玉的响应时间,全数,有了"静态页面话"的做法,当前众多网址都选取这种技能,平常都以由管理后台调整,或许生成html直接呈现,或许xhtml用css调控显示,可能生成xml用xslt展现,这个本领都不是难的,在这里笔者就浅显的说说生成html的方法.

,接下去看看里面三个子类的落到实处(该子类是用于全数单页,如数据库中有100条新闻记录,这相应的浮动九15个音信html页面,格式用模板定义的格式鲜明)

 

第一模板文件时静态的html页面,在那之中具备的需求从数据库中替换的字段用一对$富含,如数据库中的音讯标题字段为titles,则模板页中相应的标题地点用$titles$表示,页面如下

二、预备知识

 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 2 <html xmlns="http://www.w3.org/1999/xhtml">
 3 <head>
 4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 5 <title>$Titles$</title>
 6 </script>
 7 </head>
 8 <body>
 9 <div id="wrap">
10   $head$
11   <!--hd end-->
12   <div class="clear"></div>
13   <div id="wp">
14   <table border="0" cellpadding="0" cellspacing="0" width="980">
15     <tr>
16       <td rowspan="3" valign="top" id="main_box" class="index_box2">
17       <div class="subtitle subtitle4"></div>
18       <div class="article">
19       <div class="title">$Titles$</div>
20          $Contents_tw$
21       </div> 
22         
23        
24       </td>
25       <td width="48" height="44" class="ri_top">&nbsp;</td>
26   </tr>
27     <tr>
28       <td class="ri_mid" id="mid_box">&nbsp;</td>
29     </tr>
30     <tr>
31       <td height="44" class="ri_bottom">&nbsp;</td>
32     </tr>
33 </table>
34   </div>
35   <!--wp end-->
36 </div>
37 <!--wrap end-->
38 
39 $foot$
40 <!--ft end-->
41 </body>
42 </html>

 

模板本事:

到此地理解个大约了啊,接下去便是那中页面类型的子类达成,笔者将它的名称定义为ViewPage,因为全部能够单独突显的页面都得以用这么些子类,代码如下

 

  1 public class ViewPage : StaticBase
  2     {
  3         /// <summary>
  4         /// 是否操作成功
  5         /// </summary>
  6         private bool o_sucess = true;
  7         /// <summary>
  8         /// 错误信息
  9         /// </summary>
 10         private string errorstring = string.Empty;
 11         /// <summary>
 12         /// 模板文件名称
 13         /// </summary>
 14         private string masterhtml;
 15         /// <summary>
 16         /// 数据源 
 17         /// </summary>
 18         private IEnumerable<DataRow> rowlist;
 19         /// <summary>
 20         /// 模块类别
 21         /// </summary>
 22         private FlagsFileName fname;
 23         /// <summary>
 24         /// 指定命名文件的标志列(从数据库中的字段)
 25         /// </summary>
 26         private string thekey;
 27         public override bool Osucess
 28         {
 29             get { return o_sucess; }
 30             set { o_sucess = value; }
 31         }
 32         public override string Errorstring
 33         {
 34             get { return errorstring; }
 35             set { errorstring = value; }
 36         }
 37         /// <summary>
 38         /// 构造器静态生成对象
 39         /// </summary>
 40         /// <param name="rlist">需要生成静态文件的数据源</param>
 41         /// <param name="fn">文件类别枚举</param>
 42         /// <param name="myid">此字段为数据库表中字段,由该字段指定生成的文件名字标志 </param>
 43         public ViewPage(DataRow[] rlist,FlagsFileName fn,string myid)
 44         {
 45             this.thekey = myid;
 46             this.fname = fn;
 47             this.rowlist = rlist;
 48             this.masterhtml = FileName[fn] + ".html";
 49             WriteFile();
 50         }
 51 
 52         protected override bool WriteFile()
 53         {
 54             string str = "";
 55             try//从指定模板文件中读取html代码
 56             {
 57                 sr = new StreamReader(HttpContext.Current.Server.MapPath(PagePath + this.masterhtml), code);
 58                 str = sr.ReadToEnd();
 59             }
 60             catch (Exception ex)//异常则指定返回的错误信息 
 61             {
 62                 sr.Close();
 63                 sr.Dispose();
 64                 this.o_sucess = false;
 65                 this.errorstring = ex.Message;
 66                 return this.o_sucess;
 67             }
 68             sr.Close();
 69             sr.Dispose();
 70             List<FlagsFileName> fn = new List<FlagsFileName>();
 71             fn.Add(FlagsFileName.head);
 72             fn.Add(FlagsFileName.foot);
 73             PointPage pg = new PointPage(fn, str);
 74             //要保存的文件名称
 75             string htmlfilename = string.Empty;
 76             string changestring = "";//要更改的字符串
 77             foreach (DataRow row in this.rowlist)//遍历数据源数组中的每个数据表
 78             {
 79                 string newString = str;
 80                 try
 81                 {
 82                     htmlfilename = FileName[fname] + "_" + row[thekey].ToString() + ".html";//给文件命名
 83                     foreach (DataColumn c in row.Table.Columns)//遍历单个数据表的列名
 84                     {
 85                         changestring = "$" + c.ColumnName + "$";
 86                         newString = newString.Replace(changestring, row[c].ToString());
 87                     }
 88                     sw = new StreamWriter(HttpContext.Current.Server.MapPath(SavePath + htmlfilename), false, code);
 89                     sw.Write(newString);
 90                     sw.Flush();
 91                 }
 92                 catch (Exception ex)
 93                 {
 94                     this.o_sucess = false;
 95                     this.errorstring = ex.Message;
 96                     return this.o_sucess;
 97                 }
 98 
 99             }
100             sw.Dispose();
101             sw.Close();
102             return true;
103         }
104     }

[PHP] 模板引擎斯Matty深入显出介绍 --二零零七-12-31

好,到那边达成了底层的思路设计,那调用就很简短了,有些aspx页面,三个按键button,一个点击事件Button_Click,点击事件内亟待做的便是宣称二个基类StaticBase,将它实例化成多个子类ViewPage,传递的参数为三个多少项群集,DataRow[]为从数额表中读取的聚焦,蕴含必要替换的字段,如select titles,contens,id from news(从音信表中获取标志id,标题,内容),以及项目FlagsFileName.News为前几日基类提到过的枚举类型,为独立页面包车型客车转移格局,已经重命名的标志列,如此处为id,则变动的页面格式为

[PHP] 笑谈配置,使用斯马特y技巧 --二〇〇六-01-04

news_1.html,news_2.html就那样类推,代码如下

 

 1 protected void Create_Click(object sender, EventArgs e)
 2         {
 3             IEnumerable<DataRow> rowlist = TNotice_Command.SelectTNotice(-1);
 4             using (StaticBase sb = new ViewPage((DataRow[])rowlist, FlagsFileName.News, "NID"))
 5             {
 6                 if (!sb.Osucess)
 7                 {
 8                     Response.Write("<script language=javascript>alert('" + sb.Errorstring + "')</script>");
 9                 }
10             }
11         }

缓存技能:

看样子此间我们只要再开头看叁回,相信就会领悟静态文件的生成的规律了,接下去研讨若是生元素页页面的静态文件,小说内容简单,但期望能我们一点思路。

 

稍微音讯一旦常常不改变的,不过还能够变的音信放在缓存中以加速展现速度,这是很有价值的,所谓的缓存,通俗的理解正是一对封存在服务器端的共用音讯.它是于服务器同生死的,我们在保留缓存的时候能够钦命后一次更新的光阴的决断,比方要在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/二零零一/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]澳门mgm官网,",$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>

--来自互连网

 

 

 

TAG标签:
版权声明:本文由澳门mgm官网发布于新闻,转载请注明出处:浅谈php生成静态页面,生成静态html文件