[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虚拟机后,网络 ...
随机推荐
- Go语言 数据类型,流程控制
Go语言 数据类型,流程控制 人生苦短,Let's Go ! package main // 必须要有一个main包 import "fmt" func main() { fmt. ...
- C++删除容器数据
// free the contents of the list; erase the list inline void ListDelete (list <void *> *pList) ...
- vue从入门到女装??:从零开始搭建后台管理系统(二)用vue-docute生成线上文档
教程 vue从入门到女装??:从零开始搭建后台管理系统(一)安装框架 一个系统开发完成了总要有操作说明手册,接口文档之类的东西吧?这种要全部纯手写就很麻烦了,可以借助一些插件,比如: vue-docu ...
- 微信小程序自定义微信客服按钮
微信小程序官方api中提到的微信客服,是一个固定的组件,图标样式固定,大小最多27px 很明显这个是不能满足我们各种奇葩需求的.下面提供一个野蛮的自定义方法. 比如做一个这样的按钮: 图标用自定义的, ...
- python类脚本
一在windows主机上探测主机是否存活 下面以多线程的方式: import osimport timeimport subprocessfrom concurrent.futures import ...
- 怎么转化为LPCWSTR
wstring a = L"hello ,中国"; LPCWSTR b; b =(LPCWSTR) a.c_str(); RemoveDirectory(b); C++中L和_T( ...
- [Unity插件]Lua行为树(六):打印树结构
经过前面的文章,已经把行为树中的四种基本类型节点介绍了下.接下来可以整理一下,打印一下整棵行为树.注意点如下: 1.可以把BTBehaviorTree也当作一种节点,这样就可以方便地进行行为树嵌套了 ...
- c++官方文档-copy constructor
#include <iostream> using namespace std; class Example5 { string* ptr; public: Example5(const ...
- 错误:SyntaxError: Missing parentheses in call to 'print'
1.Python3编译器使用print函数需加括弧 print(XXX) 而Python 2可以print XXX 2.Python3表示不等只能用"!=" 3.在python3中 ...
- Oracle的基本数据类型(常用)
转自:https://www.2cto.com/database/201810/783959.html 1.字符型 Char 固定长度字符串 占2000个字节 Varchar2 可变长度字符串 占40 ...