PHP代码为什么不能直接保存HTML文件——>PHP生成静态页面教程

时间:2021-11-25 04:01:04
1、server会依据文件的后缀名去进行解析,假设是HTML文件则server不会进行语法解析。而是直接输出到浏览器。
2、假设一个页面中所有都是HTML代码而没有须要解析的PHP语法,则没有必要保存为PHP文件,这样反而会减少执行效率。 3、假设是须要PHP控制HTML代码的输出,比方须要PHP推断用户是否登陆,假设登陆则输出A,未登录则输出B。这就须要PHP来进行控制了。HTML不能实现这种功能

PHP生成静态页面教程 ,一些主要的概念

一,PHP脚本与动态页面。

  PHP脚本是一种server端脚本程序,可通过嵌入等方法与HTML文件混合。也能够类。函数封装等形式。以模板的方式对用户请求进行处理。

不管以何种方式,它的基本原理是这种。由client提出请求,请求某一页面 -----> WEBserver引入指定相应脚本进行处理 -----> 脚本被加载server -----> 由server指定的PHP解析器对脚本进行解析形成HTML语言形式 ----> 将解析后的HTML语句以包的方式传回给浏览器。

由此不难看出,在页面发送到浏览器后,PHP就不存在了。已被转化解析为HTML语句。客户请求为一动态文件,其实并没有真正的文件存在在那里,是PHP解析而成相相应的页面,然后发送回浏览器。

这种页面处理方式被称为“动态页面”。

二。静态页面。

  静态页面是指在server端确实存在的仅含HTML以及JS,CSS等client执行脚本的页面。

它的处理方式是。由client提出请求。请求某一页面 ----> WEBserver确认并加载某一页面 ----> WEBserver将该页面以包的形式传递回浏览器。

由这一过程,我们对照一下动态页面。就可以方现。动态页面需由WEBserver的PHP解析器进行解析,并且通常还需连接数据库,进行数据库存取操作。然后才干形成HTML语言信息包。而静态页面,无须解析,无须连接数据库,直接发送,可大大减轻server压力,提高server负载能力。大幅提供页面打开速度和站点总体打开速度。但其缺点是,不能动态地对请求进行处理,server上必须确实存在该文件。 

三。模板及模板解析。

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

 temp.html 

Code: 

<HTML>
<TITLE>{ title }</TITLE>
<BODY>
this is a { file } file's templets
</BODY>
</HTML>
PHP处理:
 templetest.php
Code: <?
$title = "拓迈国际測试模板";
$file = "TwoMax Inter test templet,
author: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;
? >

模板解析处理,即将经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: 

<?

php
$title = "拓迈国际測试模板";
$file = "TwoMax Inter test templet,
author: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: 

<?php
$title = "拓迈国际測试模板";
$file = "TwoMax Inter test templet,
author: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 ("生成分页文件完毕。如生成不全然,请检查文件权限系统后又一次生成! ");
? >

 大致思路如此。当中如其他数据生成,数据输入输出检查,分页内容指向等可酌情在页面中增加。 

  在实际文章系统处理过程其中。还有很多问题有待考虑,与动态页面不同之处,需注意的地方还有非常多。

但大致思路即是如此。其他方面可举一反三而得。 

用PHP制作静态站点的模板框架 

 模板可以改善站点的结构。

本文阐述怎样通过PHP 4的一个新功能和模板类。在由大量静态HTML页面构成的站点中巧妙地运用模板控制页面布局。 


提纲: 

=================================== 

分离功能和布局 

避免页面元素反复 

静态站点的模板框架 

===================================

分离功能和布局

首先我们来看看应用模板的两个主要目的:

分离功能(PHP)和布局(HTML)

避免页面元素反复 

   第一个目的是谈论得最多的目的,它设想的情形是:一组程序猿编写用于生成页面内容的PHP脚本,同一时候还有一组设计人员设计HTML和图形以控制页面的终于外观。分离功能和布局的基本思想就是使得这两组人可以各自编写和使用独立的一组文件:程序猿仅仅需关心那些仅仅包括PHP代码的文件,无需关心页面的外观 

。而页面设计人员能够用自己最熟悉的可视化编辑器设计页面布局。无需操心破坏不论什么嵌入到页面的PHP代码。 

   假设你以前看过几个关于PHP模板的教程,那么你应该已经明确模板的工作机制。考虑一个简单的页面局部:页面的上方是页头。左边是导航条,其余部分是内容区域。这样的站点能够拥有例如以下模板文件: 

<!-- main.htm -->
<html>
<head><title>模板演示样例</title></head>
<body>
<table><tr><td>{HEADER}</td></tr>
<tr><td>{LEFTNAV}</td><td>{CONTENT}</td></tr>
</table>
</body></html>

<!--
header.htm --> 

<img src="sitelogo.jpg"> 

<!-- leftnav.htm --> 

<br><a href="foo">Foo</a> 

<br><a href="bar">Bar</a> 

   能够看出页面怎样由这些模板构造而成:main模板控制着整个页面的布局。header模板和leftnav模板控制着页面的公共元素。花括号“{}”里面的标识符是内容占位符。使用模板最基本的优点在于界面设计者能够依照自己的意愿编辑这些文件,比方设置字体、改动颜色和图形,或者全然地改变页面的布局。

界面设计者能够用不论什么普通HTML编辑器或者可视化工具编辑这些页面。由于这些文件都仅仅包括HTML代码。没有不论什么PHP代码。 

  PHP代码所有保存到单独的文件里。这个文件也就是由页面URL实际调用的文件。Webserver通过PHP引擎解析该文件,然后把结果返回给浏览器。

一般地。PHP代码总是动态地生成页面内容,比方查询数据库或者运行某种计算等。以下是一个样例:

<?php
// example.php
require('class.FastTemplate.php');
$tpl = new FastTemplate('.');
$tpl->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', 'main');
$tpl->FastPrint('MAIN');
? >

这里我们使用的是流行的FastTemplate模板类。但其基本思路对于其它很多模板类来说都一样。

首先你实例化一个类,告诉它到哪里去寻找模板文件以及哪一个模板文件与页面的哪部分相应。接下来是生成页面内容。把结果赋予内容的标识符;然后,依次解析各个模板文件,模板类将运行必要的替换操作。最后把解析结果输出到浏览器。

   这个文件全然由PHP代码构成。不包括不论什么HTML代码。这是它最大的长处。

如今,PHP程序猿能够集中精力编写生成页面内容的代码。而不必为了怎样生成HTML去正确地格式化终于页面而操心。 

   你能够使用这样的方法和上面的文件构造出一个完整的站点。假设PHP代码是以URL中的查询字符串为基础生成页面内容。比如http://www.foo.com/example.php?article=099。你能够据此构造出一个完整的杂志站点。 

   非常easy看出採用模板还有第二个优点。

如上例所看到的。页面左边的导航条单独保存为一个文件。我们仅仅需编辑这一个模板文件就能够改变站点全部页面左边的导航条。 

避免页面元素反复 

   “这确实不错”,你或许会想,“我的站点主要就是由大量的静态页面构成。

如今我能够从全部页面中删除它们的公共部分,要更新这些公共部分实在太麻烦了。

以后我就能够用模板制作出非常easy维护的统一页面布局。”但事情并不是这么简单,“大量的静态页面”道出了问题的所在。 

   请考虑上面的样例。这个样例实际上仅仅有一个example.php页面,它之所以可以生成整个站点的全部页面,是由于它利用了URL中的查询字符串从数据库之类的信息源动态地构造出页面。

   我们之中的大多数人所执行的站点并不一定都有数据库支持。

我们的站点大多数由静态页面构成,然后用PHP在这里、那里加上一些动态功能,比方搜索引擎、反馈表单等。

那么,怎样在这样的站点上应用模板呢?

   最简单的方法是为每个页面复制一份PHP文件, 

然后在每个页面中把PHP代码里代表内容的变量设置成合适的页面内容。

比如,如果有三个页面,它们各自是主页(home)、关于(about)和产品(product)。我们能够用三个文件分别生成它们。这三个文件的内容都类如: 


<?php
// home.php
require('class.FastTemplate.php');
$tpl = new FastTemplate('.');
$tpl->define( array( 'main' => 'main.htm',
'header' => 'header.htm',
'leftnav' => 'leftnav.htm' ) );
$content = "<p>欢迎訪问</p>
<img src=\"demo.jpg\">
<p>希望你可以喜欢本站点</p>";
$tpl->assign('CONTENT', $content);
$tpl->parse('HEADER', 'header');
$tpl->parse('LEFTNAV', 'leftnav');
$tpl->parse('MAIN', 'main');
$tpl->FastPrint('MAIN');
?>

显然。这样的方法有三个问题:我们必须为每个页面复制这些复杂的、牵涉到模板的PHP代码,这与反复公共页面元素一样使得页面难以维护;如今文件又混合了HTML和PHP代码。为内容变量赋值将变得很困难,由于我们必须处理好大量的特殊字符。 

   解决问题的关键就在于分离PHP代码和HTML内容,尽管我们不能从文件里删除全部的HTML内容。但能够移出绝大多数PHP代码。

静态站点的模板框架 

   首先,我们象前面一样为全部的页面公用元素以及页面总体布局编写模板文件;然后从全部的页面删除公共部分,仅仅留下页面内容。接下来再在每一个页面中加上三行PHP代码,例如以下所看到的:

<?php
<!-- home.php -->
<? php require('prepend.php'); ?>
<?php pageStart('Home'); ?>
<h1>你好</h1>
<p>欢迎訪问</p>
<img src="demo.jpg">
<p>希望你可以喜欢本站点</p>
<?php pageFinish(); ?>
? >

这样的方法基本上攻克了前面提到的各种问题。如今文件中仅仅有三行PHP代码,并且没有不论什么一行代码直接涉及到模板。因此要修改这些代码的可能性极小。此外,因为HTML内容位于PHP标记之外。所以也不存在特殊字符的处理问题。我们能够非常easy地将这三行PHP代码增加到全部静态HTML页面中。 

   require函数引入了一个PHP文件。这个文件包括了全部必需的与模板相关的PHP代码。

当中pageStart函数设置模板对象以及页面标题,pageFinish函数解析模板然后生成结果发送给浏览器。 

   这是怎样实现的呢?为什么在调用pageFinish函数之前文件里的HTML不会发送给浏览器?答案就在于PHP 4的一个新功能,这个功能同意把输出到浏览器的内容截获到缓冲区之中。

让我们来看看prepend.php的详细代码: 

<?php
require('class.FastTemplate.php');
function pageStart($title = '') {
GLOBAL $tpl;
$tpl = new FastTemplate('.');
$tpl->define( array( 'main' => 'main.htm',
'header' => 'header.htm',
'leftnav'=> 'leftnav.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函数首先创建并设置了一个模板实例。然后启用输出缓存。

此后。全部来自页面本身的HTML内容都将进入缓存。pageFinish函数取出缓存中的内容。然后在模板对象中指定这些内容。最后解析模板并输出完毕后的页面。 

   这就是整个模板框架所有的工作过程了。

首先编写包括了站点各个页面公共元素的模板,然后从所有页面中删除所有公共的页面布局代码,代之以三行永远无需修改的PHP代码;再把FastTemplate类文件和prepend.php增加到包括路径,这样你就得到了一个页面布局能够集中控制的站点。它有着更好的可靠性和可维护性。并且站点级的大范围修改也变得相当easy。

本文下载包包括 

了一个可执行的演示样例站点,它的代码凝视要比前面的代码凝视更具体一些。FastTemplate类能够在http://www.thewebmasters.net/找到。最新的版本是1.1.0,那里另一个用于保证该类在PHP
4中正确执行的小补丁。本文下载代码中的类已经经过该补丁的修正。 

PHP简易生成静态页面 
<?php
/*
* 文件名称:index.php
*/
require "conn.php";
$query = "select * from news order by datetime desc";
$result = mysql_query($query);
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=????? ? ">
<title>NEWS</title>
</head>
<body>
<table width="500" border="1" align="center">
<tr>
<td>标题</td>
<td width="200">公布时间</td>
</tr>
<? while($re = mysql_fetch_array($result)){
?>
<tr>
<td><a href="<?= $re["newsid"].".html"?>"><?= $re["title"]? ></a></td>
<td><? = $re["datetime"]?></td>
</tr>
<? }
? >
<tr>
<td> </td>
<td><a href="addnews.php">加入新闻</a></td>
</tr>
</table>
</body>
</html>
<?php
/*
文件名称:AddNews.php
简易动态加入生成静态新闻页面
#
# 表的结构 `news`
#
CREATE TABLE `news` (
`newsid` int(11) NOT NULL auto_increment,
`title` varchar(100) NOT NULL default '',
`content` text NOT NULL,
`datetime` datetime NOT NULL default '0000-00-00 00:00:00',
KEY `newsid` (`newsid`)
) TYPE=MyISAM AUTO_INCREMENT=11 ;
*/
? >

用PHP生成静态网页的两个函数 

在近期几年。万维网(也称环球信息网。即WWW)不断改变信息处理技术的面貌。WEB已经高速地成为一种有效的媒介。并适合人们和商业沟通和协作。差点儿全部的信息技术领域都普遍受到WEB的影响。Web訪问带来很多其它用户和很多其它数据。这意味着给server和数据库很多其它压力和终于用户得到越来越慢的响应速度。与不断靠添加CPU,磁盘驱动器及内存来跟上这样的增长的需求相比,
WEB动态网页面静态化应该是一个更有用。更经济的选择。

用PHP实现WEB动态网页静态化的详细实现函数如function gen_static_file()所看到的

function gen_static_file($program, $filename)
{
$program 1= "/usr/local/apache/htdocs/php/" . $program;
$filename1 = "/usr/local/apache/htdocs/ static_html/" . $filename;
$cmd_str = "/usr/local/php4/bin/php " . $program1 . " } " . $filename1 . " ";
system($cmd_str);
echo $filename . " generated.〈br〉";
}

这个函数是实现静态化的关键,即PHP动态页面程序不是被送到浏览器中,而是输入到名为$filename的文件里去(如图2)。

两个參数中$program是PHP动态页面程序,$filename是生成的静态页面的名字(可依据须要自己制定命名规则,这一点非常重要,见下文),/usr/local/php4/bin/php是PHP中具有把程序输入文件功能的部分。System是PHP中运行外部命令的函数。我们还能够看出全部生成动态页面的php程序需放在/php/文件夹下,全部新产生的静态页面则会出如今/static_html/文件夹下(这些路径能够依据详细须要设置)。 

以下让我们举个详细样例。看一下college_static.php的静态页面是如何生成的。 

function gen_college_static ()
{
for ($i = 0; $i 〈= 32; $i++〉
{
putenv("province_id=" . $i); //*.php文件从数据库取数据时要用到。
$filename = " college_static". $i . ".html";
gen_static_file("college_static.php", $filename);
}

从这个函数我们能够看到通过调用函数gen_static_file(),
college_static.php经过静态化。变成了33个静态页面college.static0.html~college.static33.html,当中$filename会随着$I的变化而变化。当然也能够从数据库中直接取值。来控制生成的静态页面的个数和名字,其它程序对生成的静态页面的调用应和静态页面的命名规则一致。