PHP生成静态页面详解


Posted in PHP onNovember 19, 2006

一,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 
  $title = "HP爱好者测试模板";  
  $file   = "TwoMax Inter test templet,  
author:Sheyi";   $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的静态文件:
 

 $title = "拓迈国际测试模板";  
  $file   = "TwoMax Inter test templet,  
author:_Max">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处理文件中:
  

 $title = "拓迈国际测试模板";  
  $file   = "TwoMax Inter test templet,  
author:_Max">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."成功!";这句去掉,放到循环后的显示,因为该语句将中止程序执行。例: 

  $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
Nov 08 PHP
开源SNS系统-ThinkSNS
May 18 PHP
php中echo()和print()、require()和include()等易混淆函数的区别
Feb 22 PHP
PHP中使用crypt()实现用户身份验证的代码
Sep 05 PHP
浅谈PHP与C#的值类型指向区别的详解
May 21 PHP
PHP文件锁定写入实例解析
Jul 14 PHP
ThinkPHP入口文件设置及相关注意事项分析
Dec 05 PHP
php将远程图片保存到本地服务器的实现代码
Aug 03 PHP
[原创]php正则删除html代码中class样式属性的方法
May 24 PHP
老生常谈PHP中的数据结构:DS扩展
Jul 17 PHP
php把字符串指定字符分割成数组的方法
Mar 12 PHP
thinkphp5.1 框架钩子和行为用法实例分析
May 25 PHP
smarty实例教程
Nov 19 #PHP
PHP编程中八种常见的文件操作方式
Nov 19 #PHP
PHP初学入门
Nov 19 #PHP
PHP5新特性: 更加面向对象化的PHP
Nov 18 #PHP
Windows中安装Apache2和PHP4权威指南
Nov 18 #PHP
Win2003下APACHE+PHP5+MYSQL4+PHPMYADMIN 的简易安装配置
Nov 18 #PHP
Windows下的PHP5.0详解
Nov 18 #PHP
You might like
Apache实现Web Server负载均衡详解(不考虑Session版)
2013/07/05 PHP
php数组操作之键名比较与差集、交集赋值的方法
2014/11/10 PHP
php树型类实例
2014/12/05 PHP
PHP实现简易blog的制作
2016/10/24 PHP
jquery 图片Silhouette Fadeins渐显效果
2010/02/07 Javascript
jquery 元素相对定位代码
2010/10/15 Javascript
EditPlus注册码生成器(js代码实现)
2013/03/25 Javascript
node.js中的http.response.addTrailers方法使用说明
2014/12/14 Javascript
JavaScript中length属性的使用方法
2015/06/05 Javascript
基于JS实现无缝滚动思路及代码分享
2016/06/07 Javascript
Javascript DOM事件操作小结(监听鼠标点击、释放,悬停、离开等)
2017/01/20 Javascript
Angular.js去除页面中显示的空行方法示例
2017/03/30 Javascript
springMVC + easyui + $.ajaxFileUpload实现文件上传注意事项
2017/04/23 Javascript
JavaScript定义函数_动力节点Java学院整理
2017/06/27 Javascript
详解从0开始搭建微信小程序(前后端)的全过程
2019/04/15 Javascript
js实现GIF动图分解成多帧图片上传
2019/10/24 Javascript
Vue2.X和Vue3.0数据响应原理变化的区别
2019/11/07 Javascript
Vue实现计算器计算效果
2020/08/17 Javascript
python 连接sqlite及简单操作
2017/06/30 Python
Python实现嵌套列表去重方法示例
2017/12/28 Python
python中的字典操作及字典函数
2018/01/03 Python
python opencv旋转图像(保持图像不被裁减)
2018/07/26 Python
解析Python的缩进规则的使用
2019/01/16 Python
Django中多种重定向方法使用详解
2019/07/17 Python
python 获取字典特定值对应的键的实现
2020/09/29 Python
Python numpy大矩阵运算内存不足如何解决
2020/11/19 Python
英国屋顶用品和材料超市:Roofing Supplies UK
2019/08/24 全球购物
教师绩效考核方案
2014/01/21 职场文书
大学生村官演讲稿
2014/04/25 职场文书
开展党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
员工辞职信范文大全
2015/05/12 职场文书
三严三实·严以用权心得体会
2016/01/12 职场文书
React 并发功能体验(前端的并发模式)
2021/07/01 Javascript
python字符串拼接.join()和拆分.split()详解
2021/11/23 Python
Spring Boot 使用 Spring-Retry 进行重试框架
2022/04/24 Java/Android
Zabbix6通过ODBC方式监控Oracle 19C的详细过程
2022/09/23 Servers