收藏 分享(赏)

使用PHP如何生成静态页面过程详解.doc

上传人:dreamzhangning 文档编号:2533824 上传时间:2018-09-21 格式:DOC 页数:19 大小:301.50KB
下载 相关 举报
使用PHP如何生成静态页面过程详解.doc_第1页
第1页 / 共19页
使用PHP如何生成静态页面过程详解.doc_第2页
第2页 / 共19页
使用PHP如何生成静态页面过程详解.doc_第3页
第3页 / 共19页
使用PHP如何生成静态页面过程详解.doc_第4页
第4页 / 共19页
使用PHP如何生成静态页面过程详解.doc_第5页
第5页 / 共19页
点击查看更多>>
资源描述

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

2、里,是 PHP 解析而成相对应的页面,然后发送回浏览器。这种页面处理方式被称为“动态页面” 。二、静态页面静态页面是指在服务器端确实存在的仅含 HTML 以及 JS,CSS 等客户端运行脚本的页面。它的处理方式是。由客户端提出请求,请求某一页面 - WEB 服务器确认并载入某一页面 - WEB 服务器将该页面以包的形式传递回浏览器。由这一过程,我们对比一下动态页面,即可方现。动态页面需由 WEB 服务器的 PHP 解析器进行解析,而且通常还需连接数据库,进行数据库存取操作,然后才能形成 HTML 语言信息包;而静态页面,无须解析,无须连接数据库,直接发送,可大大减轻服务器压力,提高服务器负载能

3、力,大幅提供页面打开速度和网站整体打开速度。但其缺点是,不能动态地对请求进行处理,服务器上必须确实存在该文件。三,模板及模板解析PHP 处理:模板解析处理,即将经 PHP 脚本解析处理后得出的结果填充(content) 进模板的处理过程。通常借助于模板类。目前较流行的模板解析类有 phplib,smarty,fastsmarty 等等。模板解析处理的原理通常为替换。也有些程序员习惯将判断,循环等处理放进模板文件中,用解析类处理,典型应用为 block 概念,简单来说即为一个循环处理。由 PHP 脚本指定循环次数,如何循环代入等,再由模板解析类具体实施这些操作。一下如何用 PHP 生成静态文件P

4、HP 生成静态页面并不是指 PHP 的动态解析,输出 HTML 页面,而是指用 PHP 创建 HTML页面。同时因为 HTML 的不可写性,我们创建的 HTML 若有修改,则需删掉重新生成即可。(当然你也可以选择用正则进行修改,但个人认为那样做倒不如删掉重新生成来得快捷,有些得不偿失。)言归正传。用过 PHP 文件操作函数的 PHP FANS 知道,PHP 中有一个文件操作函数 fopen,即打开文件。若文件不存在,则尝试创建。这即是 PHP 可以用来创建 HTML 文件的理论基础。只要用来存放 HTML 文件的文件夹有写权限( 即权限定义 0777),即可创建文件。 (针对UNIX 系统而言

5、,Win 系统无须考虑。 )仍以上例为例,若我们修改最后一句,并指定在 test目录下生成一个名为 test.html 的静态文件:文章列表问题:在数据库中创建字段,记录文件名,每生成一个文件,将自动生成的文件名存入数据库,对于推荐文章,只需指向存放静态文件的指定文件夹中的该页面即可。利用 PHP 操作处理文章列表,存为字符串,生成页面时替换此字符串即可。如,在页面中放置文章列表的表格加入标记 articletable ,而在 PHP 处理文件中:二,分页问题如我们指定分页时,每页 20 篇。某子频道列表内文章经数据库查询为 45 条,则,首先我们通过查询得到如下参数:1,总页数;2 ,每页篇

6、数。第二步, for ($i = 0; $i 大致思路如此,其中如其它数据生成,数据输入输出检查,分页内容指向等可酌情在页面中加入。在实际文章系统处理过程当中,还有许多问题有待考虑,与动态页面不同之处,需注意的地方还有很多。但大致思路即是如此,其它方面可举一反三而得。用 PHP 制作静态网站的模板框架模板能够改善网站的结构。本文阐述如何通过 PHP 4 的一个新功能和模板类,在由大量静态 HTML 页面构成的网站中巧妙地运用模板控制页面布局。 提纲: = 分离功能和布局 =避免页面元素重复 =静态网站的模板框架 = 分离功能和布局 =首先我们来看看应用模板的两个主要目的: =分离功能(PHP)

7、和布局(HTML) =避免页面元素重复 =第一个目的是谈论得最多的目的,它设想的情形是:一组程序员编写用于生成页面内容的PHP 脚本,同时另一组设计人员设计 HTML 和图形以控制页面的最终外观。分离功能和布局的基本思想就是使得这两组人能够各自编写和使用独立的一组文件:程序员只需关心那些只包含 PHP 代码的文件,无需关心页面的外观;而页面设计人员可以用自己最熟悉的可视化编辑器设计页面布局,无需担心破坏任何嵌入到页面的 PHP 代码。如果你曾经看过几个关于 PHP 模板的教程,那么你应该已经明白模板的工作机制。考虑一个简单的页面局部:页面的上方是页头,左边是导航条,其余部分是内容区域。这种网站

8、可以拥有如下模板文件:模板示例 HEADERLEFTNAVCONTENTFooBar可以看出页面如何由这些模板构造而成:main 模板控制着整个页面的布局;header 模板和leftnav 模板控制着页面的公共元素。花括号“”里面的标识符是内容占位符。使用模板最主要的好处在于界面设计者能够按照自己的意愿编辑这些文件,比如设置字体、修改颜色和图形,或者完全地改变页面的布局。界面设计者可以用任何普通 HTML 编辑器或者可视化工具编辑这些页面,因为这些文件都只包含 HTML 代码,没有任何 PHP 代码。PHP 代码全部保存到单独的文件中,这个文件也就是由页面 URL 实际调用的文件。Web 服

9、务器通过 PHP 引擎解析该文件,然后把结果返回给浏览器。一般地,PHP 代码总是动态地生成页面内容,比如查询数据库或者执行某种计算等。下面是一个例子:define( array( main = main.htm, header = header.htm, leftnav = leftnav.htm ) ); / 此处的 PHP 代码设置$content 使其包含合适的页面内容$tpl-assign( CONTENT, $content); $tpl-parse(HEADER, header); $tpl-parse(LEFTNAV, leftnav ); $tpl-parse(MAIN, m

10、ain); $tpl-FastPrint(MAIN); ? 这里我们使用的是流行的 FastTemplate 模板类,但其基本思路对于其他许多模板类来说都一样。首先你实例化一个类,告诉它到哪里去寻找模板文件以及哪一个模板文件与页面的哪部分对应;接下来是生成页面内容,把结果赋予内容的标识符;然后,依次解析各个模板文件,模板类将执行必要的替换操作;最后把解析结果输出到浏览器。这个文件完全由 PHP 代码构成,不包含任何 HTML 代码,这是它最大的优点。现在, PHP程序员可以集中精力编写生成页面内容的代码,而不必为了如何生成 HTML 去正确地格式化最终页面而担心你可以使用这种方法和上面的文件构

11、造出一个完整的网站。如果 PHP 代码是以 URL 中的查询字符串为基础生成页面内容,例如 http:/ ,你也许会想, “我的网站主要就是由大量的静态页面构成。现在我可以从所有页面中删除它们的公共部分,要更新这些公共部分实在太麻烦了。以后我就可以用模板制作出很容易维护的统一页面布局。 ”但事情并非这么简单, “大量的静态页面”道出了问题的所在。请考虑上面的例子。这个例子实际上只有一个 example.php 页面,它之所以能够生成整个网站的所有页面,是因为它利用了 URL 中的查询字符串从数据库之类的信息源动态地构造出页面。我们之中的大多数人所运行的网站并不一定都有数据库支持。我们的网站大多

12、数由静态页面构成,然后用 PHP 在这里、那里加上一些动态功能,比如搜索引擎、反馈表单等。那么,如何在这种网站上应用模板呢?最简单的方法是为每一个页面复制一份 PHP 文件,然后在每一个页面中把 PHP 代码里代表内容的变量设置成合适的页面内容。例如,假设有三个页面,它们分别是主页(home ) 、关于(about)和产品( product) ,我们可以用三个文件分别生成它们。这三个文件的内容都类如: define( array( main = main.htm, header = header.htm, leftnav = leftnav.htm ) ); $content = “欢迎访问

13、希望你能够喜欢本网站“; $tpl-assign( CONTENT, $content); $tpl-parse(HEADER, header); $tpl-parse(LEFTNAV, leftnav ); $tpl-parse(MAIN, main); $tpl-FastPrint(MAIN); ?显然,这种方法有三个问题:我们必须为每一个页面复制这些复杂的、牵涉到模板的 PHP代码,这与重复公共页面元素一样使得页面难以维护;现在文件又混合了 HTML 和 PHP 代码;为内容变量赋值将变得非常困难,因为我们必须处理好大量的特殊字符。解决这个问题的关键就在于分离 PHP 代码和 HTML

14、内容,虽然我们不能从文件中删除所有的 HTML 内容,但可以移出绝大多数 PHP 代码。静态网站的模板框架首先,我们象前面一样为所有的页面公用元素以及页面整体布局编写模板文件;然后从所有的页面删除公共部分,只留下页面内容;接下来再在每个页面中加上三行 PHP 代码,如下所示:你好 欢迎访问 希望你能够喜欢本网站 ?这种方法基本上解决了前面提到的各种问题。现在文件里只有三行 PHP 代码,而且没有任何一行代码直接涉及到模板,因此要改动这些代码的可能性极小。此外,由于 HTML内容位于 PHP 标记之外,所以也不存在特殊字符的处理问题。我们可以很容易地将这三行PHP 代码加入到所有静态 HTML

15、页面中。 require 函数引入了一个 PHP 文件,这个文件包含了所有必需的与模板相关的 PHP 代码。其中 pageStart 函数设置模板对象以及页面标题,pageFinish 函数解析模板然后生成结果发送给浏览器。 这是如何实现的呢?为什么在调用 pageFinish 函数之前文件中的 HTML 不会发送给浏览器?答案就在于 PHP 4 的一个新功能,这个功能允许把输出到浏览器的内容截获到缓冲区之中。让我们来看看 prepend.php 的具体代码:define( array( main = main.htm, header = header.htm, leftnav = leftn

16、av.htm ) ); $tpl-assign( TITLE, $title); ob_start(); function pageFinish() GLOBAL $tpl; $content = ob_get_contents(); ob_end_clean(); $tpl-assign( CONTENT, $content); $tpl-parse(HEADER, header); $tpl-parse(LEFTNAV, leftnav ); $tpl-parse(MAIN, main); $tpl-FastPrint(MAIN); ? pageStart 函数首先创建并设置了一个模板实例

17、,然后启用输出缓存。此后,所有来自页面本身的 HTML 内容都将进入缓存。pageFinish 函数取出缓存中的内容,然后在模板对象中指定这些内容,最后解析模板并输出完成后的页面。这就是整个模板框架全部的工作过程了。首先编写包含了网站各个页面公共元素的模板,然后从所有页面中删除全部公共的页面布局代码,代之以三行永远无需改动的 PHP 代码;再把 FastTemplate 类文件和 prepend.php 加入到包含路径,这样你就得到了一个页面布局可以集中控制的网站,它有着更好的可靠性和可维护性,而且网站级的大范围修改也变得相当容易。PHP 简易生成静态页面 NEWS标题发布时间“添加新闻-ti

18、tletitlecontentdatetime;$datetime = date(“Y-m-d H:i:s“);$query = “insert into news values(,“.$title.“,“.$content.“,“.$datetime.“)“;require “conn.php“;/连接数据库$result = mysql_query($query) or die(mysql_error();if($result)$id = mysql_insert_id();$filename = $id.“.html“;if($fp = fopen($filename, “w“)/新建文

19、件,成功后添加内容$filecontent = str_replace(“title“, $title, $filecontent);$filecontent = str_replace(“content“, $content, $filecontent);$filecontent = str_replace(“datetime“, $datetime, $filecontent);if(!fwrite($fp, $filecontent)/把内容写入文件$query = “delete from news where newsid=“.$id;$result = mysql_query($q

20、uery) or die(mysql_error();fclose($fp);unlink($filename);echo “alert(Add news failed!);location.href= index.php;“;exit;else echo “alert(Add news successed!);location.href= index.php;“;?添加 标题内容PHP 生成静态页面详解 应用实例:http:/ 生成静态页面详解http:/ . /article_594_1.html看到很多朋友在各个地方发帖问 PHP 生成静态文章系统的方法,以前曾做过这样一个系统,遂谈些看

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

22、的文件存在在那里,是 PHP 解析而成相对应的页面,然后发送回浏览器。这种页面处理方式被称为“动态页面” 。二,静态页面。静态页面是指在服务器端确实存在的仅含 HTML 以及 JS,CSS 等客户端运行脚本的页面。它的处理方式是。由客户端提出请求,请求某一页面 - WEB 服务器确认并载入某一页面 - WEB 服务器将该页面以包的形式传递回浏览器。由这一过程,我们对比一下动态页面,即可方现。动态页面需由 WEB 服务器的 PHP 解析器进行解析,而且通常还需连接数据库,进行数据库存取操作,然后才能形成 HTML 语言信息包;而静态页面,无须解析,无须连接数据库,直接发送,可大大减轻服务器压力,

23、提高服务器负载能力,大幅提供页面打开速度和网站整体打开速度。但其缺点是,不能动态地对请求进行处理,服务器上必须确实存在该文件。三,模板及模板解析。模板即尚未填充内容 html 文件。例如:Code: 点击这里把以下内容复制到剪贴板 temp.htmltitlethis is a file files templetsPHP 处理:templetest.phpauthor:MatrixTwo_Max“;$fp = fopen (“temp.html“,“r“);$content = fread ($fp,filesize (“temp.html“);$content .= str_replace

24、 (“file“,$file,$content);$content .= str_replace (“title“,$title,$content);echo $content;? 模板解析处理,即将经 PHP 脚本解析处理后得出的结果填充(content) 进模板的处理过程。通常借助于模板类。目前较流行的模板解析类有 phplib,smarty,fastsmarty 等等。模板解析处理的原理通常为替换。也有些程序员习惯将判断,循环等处理放进模板文件中,用解析类处理,典型应用为 block 概念,简单来说即为一个循环处理。由 PHP 脚本指定循环次数,如何循环代入等,再由模板解析类具体实施这些

25、操作。好了,对比过静态页面与动态页面各自的优劣,现在我们就来说说,如何用 PHP 生成静态文件。PHP 生成静态页面并不是指 PHP 的动态解析,输出 HTML 页面,而是指用 PHP 创建HTML 页面。同时因为 HTML 的不可写性,我们创建的 HTML 若有修改,则需删掉重新生成即可。(当然你也可以选择用正则进行修改,但个人认为那样做倒不如删掉重新生成来得快捷,有些得不偿失。)言归正传。用过 PHP 文件操作函数的 PHP FANS 知道,PHP 中有一个文件操作函数fopen,即打开文件。若文件不存在,则尝试创建。这即是 PHP 可以用来创建 HTML 文件的理论基础。只要用来存放 H

26、TML 文件的文件夹有写权限( 即权限定义 0777),即可创建文件。 (针对UNIX系统而言,Win 系统无须考虑。 )仍以上例为例,若我们修改最后一句,并指定在 test 目录下生成一个名为 test.html 的静态文件:Code: 点击这里把以下内容复制到剪贴板 author:MatrixTwo_Max“;$fp = fopen (“temp.html“,“r“);$content = fread ($fp,filesize (“temp.html“);$content .= str_replace (“file“,$file,$content);$content .= str_rep

27、lace (“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 (“

28、创建文件“.$filename.“成功!“);? 实际应用中常见问题解决方案参考:一,文章列表问题:在数据库中创建字段,记录文件名,每生成一个文件,将自动生成的文件名存入数据库,对于推荐文章,只需指向存放静态文件的指定文件夹中的该页面即可。利用 PHP 操作处理文章列表,存为字符串,生成页面时替换此字符串即可。如,在页面中放置文章列表的表格加入标记articletable ,而在 PHP 处理文件中:Code: 点击这里把以下内容复制到剪贴板 author:MatrixTwo_Max“;$fp = fopen (“temp.html“,“r“);$content = fread ($fp,fi

29、lesize (“temp.html“);$content .= str_replace (“file“,$file,$content);$content .= str_replace (“title“,$title,$content);/ 生成列表开始$list = ;$sql = “elect id,title,filename from article“;$query = mysql_query ($sql);while ($result = mysql_fetch_array ($query)$list .= .$resulttitle. ;$content .= str_replac

30、e (“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); /

31、关闭指针die (“创建文件“.$filename.“成功!“);? 二,分页问题。如我们指定分页时,每页 20 篇。某子频道列表内文章经数据库查询为 45 条,则,首先我们通过查询得到如下参数:1,总页数;2 ,每页篇数。第二步, for ($i = 0; $i .$title.;$content = str_replace (“articletable“,$list,$content);if (is_file ($indexpath)unlink ($indexpath); /若文件已存在,则删除$handle = fopen ($indexpath,“w“); /打开文件指针,创建文件/

32、检查文件是否被创建且可写/if (!is_writable ($indexpath)echo “文件:“.$indexpath.“不可写,请检查其属性后重试!“; /修改为 echoif (!fwrite ($handle,$content) /将信息写入文件echo “生成文件“.$indexpath.“失败!“; /修改为 echo fclose ($handle); /关闭指针fclose ($fp);die (“生成分页文件完成,如生成不完全,请检查文件权限系统后重新生成!“);? 大致思路如此,其中如其它数据生成,数据输入输出检查,分页内容指向等可酌情在页面中加入。在实际文章系统处理过程当中,还有许多问题有待考虑,与动态页面不同之处,需注意的地方还有很多。但大致思路即是如此,其它方面可举一反三而得。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报