标签:
1、server会依据文件的后缀名去进行解析,假设是HTML文件则server不会进行语法解析。而是直接输出到浏览器。
2、假设一个页面中所有都是HTML代码而没有须要解析的PHP语法,则没有必要保存为PHP文件,这样反而会减少执行效率。
3、假设是须要PHP控制HTML代码的输出,比方须要PHP推断用户是否登陆,假设登陆则输出A,未登录则输出B。这就须要PHP来进行控制了。HTML不能实现这种功能
不管以何种方式,它的基本原理是这种。由client提出请求,请求某一页面 -----> WEBserver引入指定相应脚本进行处理 -----> 脚本被加载server -----> 由server指定的PHP解析器对脚本进行解析形成HTML语言形式 ----> 将解析后的HTML语句以包的方式传回给浏览器。
由此不难看出,在页面发送到浏览器后,PHP就不存在了。已被转化解析为HTML语句。客户请求为一动态文件,其实并没有真正的文件存在在那里,是PHP解析而成相相应的页面,然后发送回浏览器。
这种页面处理方式被称为“动态页面”。
它的处理方式是。由client提出请求。请求某一页面 ----> WEBserver确认并加载某一页面 ----> WEBserver将该页面以包的形式传递回浏览器。
由这一过程,我们对照一下动态页面。就可以方现。动态页面需由WEBserver的PHP解析器进行解析,并且通常还需连接数据库,进行数据库存取操作。然后才干形成HTML语言信息包。而静态页面,无须解析,无须连接数据库,直接发送,可大大减轻server压力,提高server负载能力。大幅提供页面打开速度和站点总体打开速度。但其缺点是,不能动态地对请求进行处理,server上必须确实存在该文件。
<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脚本指定循环次数,怎样循环代入等,再由模板解析类详细实施这些操作。
同一时候由于HTML的不可写性,我们创建的HTML若有改动,则需删掉又一次生成就可以。(当然你也能够选择用正则进行改动,但个人觉得那样做倒不如删掉又一次生成来得快捷,有些得不偿失。)
这即是PHP能够用来创建HTML文件的理论基础。仅仅要用来存放HTML文件的文件夹有写权限(即权限定义0777)。就可以创建文件。(针对UNIX系统而言,Win系统无须考虑。)仍以上例为例,若我们改动最后一句,并指定在test文件夹下生成一个名为test.html的静态文件:
<?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."成功!
"); ?>
如,在页面中放置文章列表的表格增加标记{ articletable },而在PHP处理文件里:
<?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."成功。"); ?>
第二步,for ($i = 0; $i < allpages; $i++)。页面元素获取,分析。文章生成,都在此循环中运行。不同的是,die ("创建文件".$filename."成功!
";这句去掉,放到循环后的显示,由于该语句将中止程序运行。例:
<?大致思路如此。当中如其他数据生成,数据输入输出检查,分页内容指向等可酌情在页面中增加。$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 4的一个新功能和模板类。在由大量静态HTML页面构成的站点中巧妙地运用模板控制页面布局。
<!-- 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 -->
界面设计者能够用不论什么普通HTML编辑器或者可视化工具编辑这些页面。由于这些文件都仅仅包括HTML代码。没有不论什么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'); ?>
首先你实例化一个类,告诉它到哪里去寻找模板文件以及哪一个模板文件与页面的哪部分相应。接下来是生成页面内容。把结果赋予内容的标识符;然后,依次解析各个模板文件,模板类将运行必要的替换操作。最后把解析结果输出到浏览器。
如今,PHP程序猿能够集中精力编写生成页面内容的代码。而不必为了怎样生成HTML去正确地格式化终于页面而操心。
如上例所看到的。页面左边的导航条单独保存为一个文件。我们仅仅需编辑这一个模板文件就能够改变站点全部页面左边的导航条。
如今我能够从全部页面中删除它们的公共部分,要更新这些公共部分实在太麻烦了。
以后我就能够用模板制作出非常easy维护的统一页面布局。”但事情并不是这么简单,“大量的静态页面”道出了问题的所在。
我们的站点大多数由静态页面构成,然后用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 <!-- home.php --> <?php require('prepend.php'); ?> <?php pageStart('Home'); ?> <h1>你好</h1> <p>欢迎訪问</p> <img src="demo.jpg"> <p>希望你可以喜欢本站点</p> <?php pageFinish(); ?> ?
>
当中pageStart函数设置模板对象以及页面标题,pageFinish函数解析模板然后生成结果发送给浏览器。
让我们来看看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。
<?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 ; */ ?>
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〉"; }
两个參数中$program是PHP动态页面程序,$filename是生成的静态页面的名字(可依据须要自己制定命名规则,这一点非常重要,见下文),/usr/local/php4/bin/php是PHP中具有把程序输入文件功能的部分。System是PHP中运行外部命令的函数。我们还能够看出全部生成动态页面的php程序需放在/php/文件夹下,全部新产生的静态页面则会出如今/static_html/文件夹下(这些路径能够依据详细须要设置)。
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的变化而变化。当然也能够从数据库中直接取值。来控制生成的静态页面的个数和名字,其它程序对生成的静态页面的调用应和静态页面的命名规则一致。
PHP代码为什么不能直接保存HTML文件——>PHP生成静态页面教程
标签:
原文地址:http://www.cnblogs.com/bhlsheji/p/5342832.html