[PHP]PHP页面静态化:真静态的两种方案
----------------------------------------------------------------------------------------------
/*
|------------------
| 方案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页面静态化:真静态的两种方案的更多相关文章
- PHP 页面静态化/纯静态化/伪静态化
个人博客迁移至独立博客:https://blog.plcent.com/,欢迎大家访问 概念 PHP静态化分为:纯静态化 和 伪静态化:纯静态化又分为:局部静态化 和 完全静态化 纯静态化:是把PHP ...
- 详解Grunt插件之LiveReload实现页面自动刷新(两种方案)
http://www.jb51.net/article/70415.htm 含Grunt系列教程 这篇文章主要通过两种方案详解Grunt插件之LiveReload实现页面自动刷新,需要的朋友可以 ...
- JSP页面中的pageEncoding和contentType两种属性
关于JSP页面中的pageEncoding和contentType两种属性的区别: pageEncoding是jsp文件本身的编码 contentType的charset是指服务器发送给客户端时的内容 ...
- 网站开发进阶(三十五)JSP页面中的pageEncoding和contentType两种属性
JSP页面中的pageEncoding和contentType两种属性 本文介绍了在JSP页面中经常用的两种属性,分别是pageEncoding和contentType,希望对你有帮助,一起来看. 关 ...
- 关于JSP页面中的pageEncoding和contentType两种属性的区别
转自:http://blog.csdn.net/dragon4s/article/details/6604624 JSP指令标签中<%@ page contentType="text/ ...
- 阶段5 3.微服务项目【学成在线】_day04 页面静态化_21-页面静态化-静态化测试-静态化程序编写
public String getPageHtml(String pageId){ /** * 静态化程序获取页面的DataUrl * * 静态化程序远程请求DataUrl获取数据模型 * * 静态化 ...
- 阶段5 3.微服务项目【学成在线】_day04 页面静态化_22-页面静态化-静态化测试-静态化程序测试
测试service内些的静态化的方法 先新建一个测试类 模板的id 放到下拉的静态数据里面 这样这条数据 就是用用的轮播图005这个模板 把这条数据静态化 进入到断点里面.先获取数据模型 获取模板时 ...
- 阶段5 3.微服务项目【学成在线】_day04 页面静态化_11-freemarker静态化测试-基于模板字符串静态化
再定义一个测试方法 把拿到的字符串变成模板 加载器设置好了以后, 加一个断点来测试 生成模板文件 上面这种方式很灵活. 最终代码 @Test public void testGenerateHtmlB ...
- 阶段5 3.微服务项目【学成在线】_day04 页面静态化_10-freemarker静态化测试-基于模板文件静态化
把resource拷贝到test目录下 只保留文件夹结构和test1.ftl这个模板文件就可以了. 新建一个包 编写测试类 使用freemaker提供的方法生成静态文件 Configuration是i ...
- Hyper-V 下linux虚拟机静态IP上网配置的两种方式(2)
工作需要,搭建linux环境,网上搜了两种Hyper-V配置linux静态IP及上网的方式,记录一下,方便查阅,如下设置网络共享方式: win10下使用hyper-v在本机安装linux虚拟机后,网络 ...
随机推荐
- ip route 命令详解
linux的ip命令和ifconfig类似,但前者功能更强大,并旨在取代后者.使用ip命令,只需一个命令,你就能很轻松地执行一些网络管理任务.ifconfig是net-tools中已被废弃使用的一个命 ...
- Spring MVC 处理异常
SpringMVC处理异常: 1 使用@ExceptionHandler注解 只有ModelAndView可以携带错误信息 @ExceptionHandler public ModelAndView ...
- 轻型DNS服务器dnsmasq
源码安装 源码下载地址 apt 安装 apt install dnsmasq 编辑配置 vim /etc/dnsmasq.conf resolv-file=/etc/resolv.dnsmasq.co ...
- scrapy框架之日志等级和请求传参-cookie-代理
一.Scrapy的日志等级 - 在使用scrapy crawl spiderFileName运行程序时,在终端里打印输出的就是scrapy的日志信息. - 日志信息的种类: ERROR : 一般错误 ...
- CCProxy
我在之前的博客里提到了用Teamviewer + CCProxy做内网穿透,当时只是简单提了一下,因为发现这种方式网速比较慢.今天又用到了它,虽然慢点,但是总比没的用好,哈哈哈.不得不感叹CCProx ...
- solr 使用edismax来控制评分
如何控制评分 如果设置了sort字段,那么将会按照sort字段的顺序返回结果. 如果没有设置sort字段,那么将会根据相关度打分来排序.也就是说,相关度更高的排在前面. 如何来定制适合自身业务的排序打 ...
- MySQL ERROR 1300 (HY000): Invalid utf8 character string
load data报错 原因:原始数据含有 中文\中文 这样的带斜线的字符串. 解决方案:导出的时候替换 replace(d.role_name,'\\','.' ),这样导入时候就不用处理了
- 安装Thinkphp5
Thinkphp完全开发手册地址:https://www.kancloud.cn/manual/thinkphp5/118006 1.安装扩展mbstring扩展:sudo apt-get insta ...
- ERROR: duplicate key value violates unique constraint "xxx"
在postgresql中,由于为表的主键建立了自增序列,且数据是从正式库拷贝到正式库的,所以报错如下: (主要原因:自增序列中的当前序列号小于真实数据中的最大主键值,因此在新增数据时,会报唯一值的错误 ...
- SVG 学习<五> SVG动画
目录 SVG 学习<一>基础图形及线段 SVG 学习<二>进阶 SVG世界,视野,视窗 stroke属性 svg分组 SVG 学习<三>渐变 SVG 学习<四 ...