PHP生成静态HTML的技术原理

简介:
+关注继续查看

PHP页面的静态化很有必要,尤其是在CMS系统中,一些内容一旦生成,基本上不会有变化,这时如果用html将页面静态化,无疑会减少服务其解析PHP页面的负担。以下是看书学来的PHP静态化技术,记录之以备不时之需。
无论是利用框架还是简单的脚本,原理基本一致:就是利用PHP进行文件操作,替换html模板中的动态元素。

用Replace函数即php的str_replace函数将模版文件中读取的内容中的关键字替换成变量中的内容,从而实现简单的模板分离。

1.新增与回显

insert.htm文件代码:在标题和内容框中分别输入:“这是标题”和“这是内容”

Java代码  收藏代码
  1. <html>  
  2. <head>  
  3. <title>添加一条新记录</title>  
  4. <meta http-equiv="Content-Type" content="text/html; charset=gb2312">  
  5. </head>  
  6.   
  7. <body>  
  8.  <p><h1>添加一条新记录</h1></p>  
  9.  <form name="form1" method="post" action="insert.php">  
  10.    <table width="500" border="0" cellspacing="0" cellpadding="0">  
  11.      <tr>  
  12.        <td>标题</td>  
  13.        <td><input name="title" type="text" id="title"></td>  
  14.      </tr>  
  15.      <tr>  
  16.        <td>内容</td>  
  17.        <td><textarea name="body" cols="35" rows="5" id="body"></textarea></td>  
  18.      </tr>  
  19.      <tr>  
  20.        <td colspan="2"><input type="submit" name="Submit" value="Submit">  
  21.        <input type="reset" name="Submit2" value="Reset"></td>  
  22.      </tr>  
  23.    </table>  
  24. </form>  
  25. </body>  
  26. </html>  
 

模板文件template.htm: 

Java代码  收藏代码
  1. <html>   
  2. <head>   
  3. <title>%title%</title>   
  4. </head>   
  5. <body>   
  6. <H1>%title%</H1>   
  7. <hr>   
  8. <pre>%body%</pre>   
  9. </body>   
  10. </html>    

 php

Java代码  收藏代码
  1. <?php  
  2. //Replace函数用于将从模版文件中读取的内容中的关键字替换成变量中的内容  
  3. function Replace($row, $title='', $body='')  
  4. {  
  5.     //替换参数中的关键字  
  6.     $row   = str_replace("%title%", $title, $row);  
  7.     $row   = str_replace("%body%", $body, $row);  
  8.     //返回替换后的结果  
  9.     return $row;  
  10. }  
  11. //主程序开始  
  12. @mysql_connect("localhost""root","1981427")               //选择数据库之前需要先连接数据库服务器  
  13. or die("数据库服务器连接失败");  
  14. @mysql_select_db("test")                    //选择数据库mydb  
  15. or die("数据库不存在或不可用");  
  16. //将表单中的数据通过$_POST方式获取然后存储在相应的变量中  
  17. $title = $_POST['title'];  
  18. $body = $_POST['body'];  
  19.   
  20. //生成文件名  
  21. $filename = 'S'.date("YmdHis").'.htm';  
  22. //执行SQL语句  
  23. $query = mysql_query("insert into news values('$title', '$body', '$filename')");  
  24. //根据SQL执行语句返回的bool型变量判断是否插入成功  
  25. if($query)  
  26. {  
  27.     //模版文件指针  
  28.     $f_tem = fopen("template.htm","r");  
  29.     //生成的文件指针  
  30.     $f_new = fopen('new.htm',"w");  
  31.     //$f_new = fopen($filename,"w");  
  32.     //循环读取模版文件,每次读取一行  
  33.     while(!feof($f_tem))   
  34.     {  
  35.         $row = fgets($f_tem);  
  36.         $row = Replace($row, $title, $body);            //替换读入内容中的关键字  
  37.         fwrite($f_new, $row);           //将替换后的内容写入生成的HTML文件  
  38.     }  
  39.     //关闭文件指针  
  40.     fclose($f_new);  
  41.     fclose($f_tem);  
  42.     //提示  
  43.   echo "数据插入成功";  
  44. }  
  45. else  
  46.     echo "数据插入失败";  
  47. mysql_close();                                  //关闭与数据库服务器的连接  
  48. ?>  

 生成新的html页:new.html

Java代码  收藏代码
  1. <html>   
  2. <head>   
  3. <title>文章标题</title>   
  4. </head>   
  5. <body>   
  6. <H1>文章标题</H1>   
  7. <hr>   
  8. <pre>这里是文章主体</pre>   
  9. </body>   
  10. </html>   

2.修改与回显edit.php

Java代码  收藏代码
  1. <?php  
  2. //主程序开始  
  3. @mysql_connect("localhost""root","orbit")             //选择数据库之前需要先连接数据库服务器  
  4. or die("数据库服务器连接失败");  
  5. @mysql_select_db("test")                    //选择数据库mydb  
  6. or die("数据库不存在或不可用");  
  7. $query = mysql_query("select * from news where title='这是标题'");  
  8. //根据SQL执行语句返回的bool型变量判断是否插入成功  
  9. $row = mysql_fetch_array($query);  
  10. ?>  
  11. <html>  
  12. <head>  
  13. <title>修改一条新记录</title>  
  14. <meta http-equiv="Content-Type" content="text/html; charset=gb2312">  
  15. </head>  
  16.   
  17. <body>  
  18.  <p><h1>修改一条新记录</h1></p>  
  19.  <form name="form1" method="post" action="mdf_to_staitc.php">  
  20.    <table width="500" border="0" cellspacing="0" cellpadding="0">  
  21.      <tr>  
  22.        <td>标题</td>  
  23.        <td><input name="title" type="text" id="title" value="<?php echo $row['title']?>"></td>  
  24.      </tr>  
  25.      <tr>  
  26.        <td>内容</td>  
  27.        <td><textarea name="body" cols="35" rows="5" id="body"><?php echo $row['body']?></textarea></td>  
  28.      </tr>  
  29.      <tr>  
  30.      <input name="filename" type="hidden" value="<?php echo $row['filename']?>">  
  31.        <td colspan="2"><input type="submit" name="Submit" value="Submit">  
  32.      </tr>  
  33.    </table>  
  34. </form>  
  35. </body>  
  36. </html>  

php

Java代码  收藏代码
  1. <?php  
  2. //Replace函数用于将从模版文件中读取的内容中的关键字替换成变量中的内容  
  3. function Replace($row, $title='', $body='')  
  4. {  
  5.     //替换参数中的关键字  
  6.     $row   = str_replace("%title%", $title, $row);  
  7.     $row   = str_replace("%body%", $body, $row);  
  8.     //返回替换后的结果  
  9.     return $row;  
  10. }  
  11. //主程序开始  
  12. @mysql_connect("localhost""root","orbit")             //选择数据库之前需要先连接数据库服务器  
  13. or die("数据库服务器连接失败");  
  14. @mysql_select_db("test")                    //选择数据库mydb  
  15. or die("数据库不存在或不可用");  
  16.   
  17. mysql_query("update news set title='".$_POST['title']."',body='".$_POST['body']."' where filename='".$_POST['filename']."' ");  
  18. $query = mysql_query("select * from news where filename='".$_POST['filename']."' ");  
  19. //根据SQL执行语句返回的bool型变量判断是否插入成功  
  20. while($record = mysql_fetch_array($query))  
  21. {  
  22.     echo "<pre>";  
  23.     print_r($record);  
  24.     //模版文件指针  
  25.     $f_tem = fopen("template.htm","r");  
  26.     //生成的文件指针  
  27.     $f_new = fopen($record['filename'],"w");  
  28.     //循环读取模版文件,每次读取一行  
  29.     while(!feof($f_tem))   
  30.     {  
  31.         $row = fgets($f_tem);  
  32.         $row = Replace($row, $record['title'], $record['body']);    //替换读入内容中的  
  33.         fwrite($f_new, $row);           //将替换后的内容写入生成的HTML文件  
  34.     }  
  35.     //关闭文件指针  
  36.     fclose($f_new);  
  37.     fclose($f_tem);  
  38. }  
  39. mysql_close();                                  //关闭与数据库服务器的连接  
  40. ?>  
  41.   
  42. mysql_close();                                  //关闭与数据库服务器的连接  
  43. ?>  

3.一般的CMS都会记录内容被浏览的信息,例如浏览次数或者浏览者的IP信息等,静态页面要记录这些信息,可以在模板中加入一个长宽都为0的图片,指向计数脚本。

以记录浏览次数为例:
<img width='0' height='0' src='counter.php?fileID=S001' />
这样,计数操作可以放到counter.php中进行,又不会破坏网页的静态性。

<?php

Java代码  收藏代码
  1. $query = mysql_query("update counter set count+=1 where fileid='".$fileid."' ");  
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
7月前
|
PHP 开发者
《阿里云栖开发者沙龙PHP技术专场-静态扫描为你的项目上线保驾护航-周梦康》电子版地址
阿里云栖开发者沙龙PHP技术专场-静态扫描为你的项目上线保驾护航-周梦康
131 0
《阿里云栖开发者沙龙PHP技术专场-静态扫描为你的项目上线保驾护航-周梦康》电子版地址
|
9月前
|
Java 开发者
页面静态之生成 html 页面 | 学习笔记
快速学习页面静态之生成 html 页面
|
11月前
|
开发框架 前端开发 Java
PHP 的基础语法_动态网站和静态网站| 学习笔记
快速学习 PHP 的基础语法_动态网站和静态网站。
74 0
PHP 的基础语法_动态网站和静态网站| 学习笔记
|
11月前
520礼物 静态HTML 来自理工男的浪漫 源码开放
520礼物 静态HTML 来自理工男的浪漫 源码开放
520礼物 静态HTML 来自理工男的浪漫 源码开放
起个服务把静态html文件放在手机上访问
起个服务把静态html文件放在手机上访问
127 0
起个服务把静态html文件放在手机上访问
|
Java 开发者
页面静态之生成 html 页面 | 学习笔记
快速学习页面静态之生成 html 页面。
|
搜索推荐 Perl
strapdown.js HTML 内嵌 Markdown 的静态解决方案
只需在 html 文件中引用strapdown.js,然后在<xmp>标签内书写 Markdown 内容即可。浏览器加载时会自动将 Markdown 渲染为 HTML。再方便不过。
231 0
strapdown.js HTML 内嵌 Markdown 的静态解决方案
|
缓存 PHP
PHP 静态缓存
php静态缓存
|
测试技术 PHP 开发者
阿里云栖开发者沙龙PHP技术专场-静态扫描为你的PHP项目上线保驾护航
摘要:在4月20日的阿里云栖开发者沙龙PHP技术专场上,阿里云资深研发工程师周梦康(楚松)为大家分享了如何借助静态扫描来为我们的PHP项目上线保驾护航,他从Why、How和What三个角度为大家分享了静态扫描的落地实践和最终成果。
1688 0
推荐文章
更多