----------------------------------------------------------------------------------------------

/*
|------------------
| 方案1:如果静态文件存在,且生成时间30秒内,直接返回静态页面(有时间延迟) <www.farwish.com>
|------------------
*/
header('content-type:text/html;charset=utf-8');
$id = $_GET['id'] ? intval($_GET['id']) : '';
if($id === '') die('请输入要查询的新闻id!');
$html_file = "news-id-".$id.".html"; //1.主要代码
if(file_exists($html_file) && filemtime($html_file) + 30 >= time())
{
echo '静态页面:';
echo file_get_contents($html_file);exit;
} //这里也可以使用DB工具类
$con = mysql_connect('localhost', 'root', '123456');
if(!$con)
{
die('连接失败!');
}
mysql_select_db('testdb', $con);
$sql = "select * from bo_question where question_id = $id";
$res = mysql_query($sql, $con);
if($row = mysql_fetch_assoc($res))
{
ob_start();//2.启动ob缓存
header('content-type:text/html;charset=utf-8');
echo '<head><meta http-equiv="content-type" content="text/html;charset=utf-8" /></head>';
echo '<table style="border:1px solid red;" cellspacing="0" width="400px" height="200px">';
echo '<tr><td>问题详细内容</td></tr>';
echo "<tr><td>标题:{$row['question_title']}</td></tr>";
echo "<tr><td>详细:{$row['question_detail']}</td></tr>";
echo '</table>';
$ob_str = ob_get_contents();
//3.把ob_str保存到一个静态文件页面,取文件名有讲究:1.唯一标识该新闻 2.利于seo
file_put_contents("news-id-".$id.".html", $ob_str);
  
  //关闭数据库连接(非必须; 非长连接下,脚本执行完会自动关闭)
  mysql_close($con);
}else{
echo '没有查询到资源!';
}


/*
|----------------------------------------------------
| 方案2:使用模板替换技术(没有时间延迟) <www.farwish.com>
|----------------------------------------------------
*/
$oper = $_POST['oper'];//添加操作
if($oper === 'add')
{
$title = $_POST['title'];
$content = $_POST['content']; //如果严格按MVC,这里应该调用model了
$con = mysql_connect('localhost', 'root', '123456');
if(!$con)
{
die('连接失败!');
}
mysql_select_db('news', $con);
$sql = "insert into question(null, '$title', '$content', '')";
if(mysql_query($sql, $con))
{
//1.生成静态文件
$id = mysql_insert_id();
$html_filename = 'news-id'.$id.'.html';
$html_fp = fopen($html_filename, 'w'); //2.把模板文件读取(news.html)
$fp = fopen('news.tpl', 'r');
//r 只读方式打开; r+ 读写方式打开; w 写入方式打开:文件内容将被清空!如果文件不存在将创建; a 以追加的方式打开 //3.循环读取
//如果没有读到文件的最后,就一直读取
while(!feof($fp))
{
//一行行读
$row = fgets($fp);
//把占位符替换掉 => 可以自定义完整的替换规则函数
$row = str_replace('%title%', $title, $row);//如果不重新赋值$row, $row值不会改变
$row = str_replace('%content%', $content, $row); fwrite($html_fp, $row);//4.将内容写入静态文件
}
//5.文件必须关闭
fclose($html_fp);
fclose($fp); echo "添加成功。<a href='newslist.php'>点击查看新闻!</a>";
}
else
{
die('添加失败!');
}
}
//此时在新闻列表内,点击查看详情的链接,可以改成生成的静态页面地址,直接进入静态文件。 //news.tpl模板文件
/*
<html>
<head>
<meta charset="utf-8" />
<title>%title%</title>
</head>
<body>
<h1>%title%</h1>
<pre>%content%</pre>
</body>
</html>
*/

Link: http://www.cnblogs.com/farwish/p/3874264.html

@黑眼诗人 <www.farwish.com>

[PHP]PHP页面静态化:真静态的两种方案的更多相关文章

  1. PHP 页面静态化/纯静态化/伪静态化

    个人博客迁移至独立博客:https://blog.plcent.com/,欢迎大家访问 概念 PHP静态化分为:纯静态化 和 伪静态化:纯静态化又分为:局部静态化 和 完全静态化 纯静态化:是把PHP ...

  2. 详解Grunt插件之LiveReload实现页面自动刷新(两种方案)

    http://www.jb51.net/article/70415.htm    含Grunt系列教程 这篇文章主要通过两种方案详解Grunt插件之LiveReload实现页面自动刷新,需要的朋友可以 ...

  3. JSP页面中的pageEncoding和contentType两种属性

    关于JSP页面中的pageEncoding和contentType两种属性的区别: pageEncoding是jsp文件本身的编码 contentType的charset是指服务器发送给客户端时的内容 ...

  4. 网站开发进阶(三十五)JSP页面中的pageEncoding和contentType两种属性

    JSP页面中的pageEncoding和contentType两种属性 本文介绍了在JSP页面中经常用的两种属性,分别是pageEncoding和contentType,希望对你有帮助,一起来看. 关 ...

  5. 关于JSP页面中的pageEncoding和contentType两种属性的区别

    转自:http://blog.csdn.net/dragon4s/article/details/6604624 JSP指令标签中<%@ page contentType="text/ ...

  6. 阶段5 3.微服务项目【学成在线】_day04 页面静态化_21-页面静态化-静态化测试-静态化程序编写

    public String getPageHtml(String pageId){ /** * 静态化程序获取页面的DataUrl * * 静态化程序远程请求DataUrl获取数据模型 * * 静态化 ...

  7. 阶段5 3.微服务项目【学成在线】_day04 页面静态化_22-页面静态化-静态化测试-静态化程序测试

    测试service内些的静态化的方法 先新建一个测试类 模板的id 放到下拉的静态数据里面 这样这条数据 就是用用的轮播图005这个模板 把这条数据静态化 进入到断点里面.先获取数据模型 获取模板时 ...

  8. 阶段5 3.微服务项目【学成在线】_day04 页面静态化_11-freemarker静态化测试-基于模板字符串静态化

    再定义一个测试方法 把拿到的字符串变成模板 加载器设置好了以后, 加一个断点来测试 生成模板文件 上面这种方式很灵活. 最终代码 @Test public void testGenerateHtmlB ...

  9. 阶段5 3.微服务项目【学成在线】_day04 页面静态化_10-freemarker静态化测试-基于模板文件静态化

    把resource拷贝到test目录下 只保留文件夹结构和test1.ftl这个模板文件就可以了. 新建一个包 编写测试类 使用freemaker提供的方法生成静态文件 Configuration是i ...

  10. Hyper-V 下linux虚拟机静态IP上网配置的两种方式(2)

    工作需要,搭建linux环境,网上搜了两种Hyper-V配置linux静态IP及上网的方式,记录一下,方便查阅,如下设置网络共享方式: win10下使用hyper-v在本机安装linux虚拟机后,网络 ...

随机推荐

  1. XXE注入攻击与防御

    在研究XXE注入攻击之前先了解一下什么是XXE 定义 XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言.XML文档结构包括 ...

  2. 封装MemoryCache

    一.定义一个缓存接口IChace using System; using System.Collections.Generic; using System.Linq; using System.Tex ...

  3. 性能测试day01_性能基本概念

    其实第一次接触性能是15年的时候,懵懵懂懂的被领导拉去做第一次做性能压测,如今有机会重新听一下云层大大讲解性能,于是打算以此博客记录下整个学习的过程,如若有不同意见者可以在下面留言指出,也欢迎大家一起 ...

  4. 微信小程序笔记<七>视图层 —— wxml

    微信小程序的视图层由 *.wxml 组成,wxml与html一样属于标签语言,但wxml与html的标签截然不一样. xwml特性 一.数据绑定 <!--wxml--> <view& ...

  5. 【Jmeter自学】jmeter实战-其他请求和总结(七)

    FTP测试 步骤:其他的结果树等跟http请求一样  mysql数据库测试 JDBC请求 Jmeter-分布式性能测试 jmeter结果分析:

  6. python对象序列化pickle

    import pickle class A: users = {} c = 1 def get_self(self): return self def n(self): return 1 def pi ...

  7. hive之窗口函数

    窗口函数 1.相关函数说明 COVER():指定分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变而变化 CURRENT ROW:当前行 n PRECEDING:往前n行数据 n FOLLO ...

  8. 25.纯 CSS 创作一个慧星拖尾效果的 loader 动画

    原文地址:https://segmentfault.com/a/1190000014916281 简化地址:https://codepen.io/pen/?editors=1100 HTML代码: & ...

  9. java json字符串与对象转换

    下载引入包gson-2.0.jar 1.字符转数据 final Map map = new HashMap();map.put("contents",    "[{\&q ...

  10. [记录] CSS 左边元素定长,右边元素获得剩余长度

    情景:左边元素定长,右边元素获得剩余长度 1. 左边设置浮动,右边元素宽度auto,可以不设置,默认auto,然后设置margin-left:左边元素宽度 <ul class="ent ...