静态化 - 真静态技术
静态化,真静态技术。
采用php的ob缓存技术实现,结合手写模版引擎代码。
一个小实例,新闻管理系统。
项目说明:
为了便于SEO,要将新闻的页面做成静态化的页面。网址是静态的html,内容也是静态的。(如果只是网址是静态的,内容是动态的,就是伪静态,一般网站使用的都是伪静态技术股。)
网址静态化(点击之后跳转到静态化的网页):
项目结构介绍:
- admin:后台管理文件夹。
- index.html:后台管理首页。
- newsadd.php:后台添加新闻页面。
- newsupdate.php:后台修改新闻页面。
- newsupdatelist.php:后台修改新闻列表。
- cache:缓存文件夹:用开存储静态网页。
- 原理解释:在添加新闻的时候,就利用ob缓存技术,生成了静态页面,存放的地址就是cache。之后点击的每条新闻,其实是从这里提取,不在通过数据库。
- includes:页面解析及其生成静态文件,核心代码。参考手写模版引擎
- Parser.class.php:解析类
- Templates.class.php:模板文件
- templates:模板文件夹,存放用于显示信息的模板文件。
- conn.php:数据库配置文件
- newslist.php:首页,新闻显示页面。
- template.inc.php:模板配置文件。
- test.php:测试文件,用于测试使用。
conn.php:
代码;
<?php
//连接数据库参数
define('DB_HOST', 'localhost');
define('DB_NAME', 'db_news');
define('DB_USER', 'root');
define('DB_PWD', '123456');
define('DB_CHARSET', 'UTF8');//连接数据库
mysql_connect(DB_HOST,DB_USER,DB_PWD) or die('数据库连接失败!');
mysql_select_db(DB_NAME) or die('选择数据库失败!');
mysql_query("SET NAMES '" . DB_CHARSET. "'") or die('设置字符集编码出错!');
templates.inc.php:
<?php //创建网站根目录常量define('ROOT_PATH', dirname(__FILE__) . DIRECTORY_SEPARATOR);//模板文件目录define('TPL_DIR', ROOT_PATH . 'templates' . DIRECTORY_SEPARATOR);//缓存目录define('CACHE', ROOT_PATH . 'cache' . DIRECTORY_SEPARATOR);//是否开启缓存define('IS_CACHE', true);IS_CACHE ? ob_start() : NULL;//引入模板类require ROOT_PATH . 'includes' . DIRECTORY_SEPARATOR . 'Template.class.php';
?>
newslist.php:首页:
代码:
<?php
/*** 显示新闻列表*/header('Content-Type:text/html; charset="UTF-8"');require dirname(__FILE__) . '/conn.php'; $query = 'SELECT id, title, content, time FROM `news`';$resHandle = mysql_query($query);
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd"><html>
<head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>新闻列表显示</title><style type="text/css">li{height:50px;}</style>
</head>
<body>
<h2><a href="admin/index.html">进入后台</a></h2><ul><?php while (!!$result = mysql_fetch_array($resHandle,MYSQL_ASSOC)) { ?><li><a href="cache/News_id<?php echo $result['id']; ?>.html"><?php echo $result['title']; ?></a>-- <span><?php echo $result['content']; ?></span>-- <span><?php echo $result['time']; ?></span></li><?php } ?></ul>
</body>
</html>
admin-->index.html:
代码:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>后台管理页面</title>
</head>
<body><ul><li><a href="newsadd.php">添加新闻</a></li><li><a href="newsupdatelist.php">修改新闻</a></li></ul>
</body>
</html>
admin-->newsadd.php页面:
代码:
<?php;
/*** 添加新闻*/
require $_SERVER['DOCUMENT_ROOT'] . '/static/conn.php';
require $_SERVER['DOCUMENT_ROOT'] . '/static/templates.inc.php';//插入数据库数据
if ( isset($_POST['submit']) ) {mysql_query("INSERT into news (title,content) VALUES ('".$_POST['title']."','".$_POST['content']."')");if ( mysql_affected_rows() == '1' ) {//静态化页面//实例化模版类$template = new Templates();//注入变量$template->assign('title',$_POST['title']);$template->assign('content',$_POST['content']);//调用display方法$template->display('details.tpl',mysql_insert_id());header('location:http://localhost/static/newslist.php');}
}?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd"><html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<META HTTP-EQUIV="pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Cache-Control" CONTENT="no-cache, must-revalidate">
<META HTTP-EQUIV="expires" CONTENT="Wed, 26 Feb 1997 08:21:57 GMT">
<META HTTP-EQUIV="expires" CONTENT="0">
<title>添加新闻</title>
</head>
<body><form action="newsadd.php" method="post"><table><tr><td>新闻标题</td><td><input type="text" name="title"/></td></tr><tr><td>新闻内容</td><td><textarea rows="3" cols="14" name="content"></textarea></td></tr><tr><td><input type="submit" name="submit" value="提交"/></td></tr></table></form>
</body>
</html>
admin-->newsupdate.php:后台新闻修改页面:
代码:
<?php
/*** 显示新闻列表*/header('Content-Type:text/html; charset="UTF-8"');require $_SERVER['DOCUMENT_ROOT'] . '/static/conn.php';
require $_SERVER['DOCUMENT_ROOT'] . '/static/templates.inc.php';$result = NULL;if (isset($_GET['id']) && !empty($_GET['id']) ) {$id = $_GET['id'];$res = mysql_query("select id, title, content from news where id= ".$_GET['id']);$result = mysql_fetch_array($res,MYSQL_ASSOC);
} if ( isset($_POST['submit']) ) {mysql_query("UPDATE news SET title = '".$_POST['title']."' ,content = '".$_POST['content']."' WHERE id = '".$_POST['id']."'");if (mysql_affected_rows() == '1') {//实例化模版类$template = new Templates();//注入变量$template->assign('title',$_POST['title']);$template->assign('content',$_POST['content']);//调用display方法$template->display('details.tpl',$_POST['id']);header('location:http://localhost/static/admin/newsupdatelist.php');}
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd"><html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<META HTTP-EQUIV="pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Cache-Control" CONTENT="no-cache, must-revalidate">
<META HTTP-EQUIV="expires" CONTENT="Wed, 26 Feb 1997 08:21:57 GMT">
<META HTTP-EQUIV="expires" CONTENT="0">
<title>添加新闻</title>
</head>
<body><form action="newsupdate.php" method="post"><table><tr><td>新闻标题</td><td><input type="hidden" name="id" value="<?php echo $result['id'] ?>" /><input type="text" name="title" value="<?php echo $result['title']; ?>"/></td></tr><tr><td>新闻内容</td><td><textarea rows="3" cols="14" name="content"><?php echo $result['content']; ?></textarea></td></tr><tr><td><input type="submit" name="submit" value="修改"/></td></tr></table></form>
</body>
</html>
admin-->newsupdatelist.php:后台修改新闻列表页:
代码:
<?php
/*** 显示新闻列表*/header('Content-Type:text/html; charset="UTF-8"');require $_SERVER['DOCUMENT_ROOT'] . '/static/conn.php';
require $_SERVER['DOCUMENT_ROOT'] . '/static/templates.inc.php';$result = NULL;if (isset($_GET['id']) && !empty($_GET['id']) ) {$id = $_GET['id'];$res = mysql_query("select id, title, content from news where id= ".$_GET['id']);$result = mysql_fetch_array($res,MYSQL_ASSOC);
} if ( isset($_POST['submit']) ) {mysql_query("UPDATE news SET title = '".$_POST['title']."' ,content = '".$_POST['content']."' WHERE id = '".$_POST['id']."'");if (mysql_affected_rows() == '1') {//实例化模版类$template = new Templates();//注入变量$template->assign('title',$_POST['title']);$template->assign('content',$_POST['content']);//调用display方法$template->display('details.tpl',$_POST['id']);header('location:http://localhost/static/admin/newsupdatelist.php');}
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd"><html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<META HTTP-EQUIV="pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Cache-Control" CONTENT="no-cache, must-revalidate">
<META HTTP-EQUIV="expires" CONTENT="Wed, 26 Feb 1997 08:21:57 GMT">
<META HTTP-EQUIV="expires" CONTENT="0">
<title>添加新闻</title>
</head>
<body><form action="newsupdate.php" method="post"><table><tr><td>新闻标题</td><td><input type="hidden" name="id" value="<?php echo $result['id'] ?>" /><input type="text" name="title" value="<?php echo $result['title']; ?>"/></td></tr><tr><td>新闻内容</td><td><textarea rows="3" cols="14" name="content"><?php echo $result['content']; ?></textarea></td></tr><tr><td><input type="submit" name="submit" value="修改"/></td></tr></table></form>
</body>
</html>
cache-->News_id57.html
代码:
<?php
/*** 显示新闻列表*/header('Content-Type:text/html; charset="UTF-8"');require $_SERVER['DOCUMENT_ROOT'] . '/static/conn.php';
require $_SERVER['DOCUMENT_ROOT'] . '/static/templates.inc.php';$result = NULL;if (isset($_GET['id']) && !empty($_GET['id']) ) {$id = $_GET['id'];$res = mysql_query("select id, title, content from news where id= ".$_GET['id']);$result = mysql_fetch_array($res,MYSQL_ASSOC);
} if ( isset($_POST['submit']) ) {mysql_query("UPDATE news SET title = '".$_POST['title']."' ,content = '".$_POST['content']."' WHERE id = '".$_POST['id']."'");if (mysql_affected_rows() == '1') {//实例化模版类$template = new Templates();//注入变量$template->assign('title',$_POST['title']);$template->assign('content',$_POST['content']);//调用display方法$template->display('details.tpl',$_POST['id']);header('location:http://localhost/static/admin/newsupdatelist.php');}
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd"><html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<META HTTP-EQUIV="pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Cache-Control" CONTENT="no-cache, must-revalidate">
<META HTTP-EQUIV="expires" CONTENT="Wed, 26 Feb 1997 08:21:57 GMT">
<META HTTP-EQUIV="expires" CONTENT="0">
<title>添加新闻</title>
</head>
<body><form action="newsupdate.php" method="post"><table><tr><td>新闻标题</td><td><input type="hidden" name="id" value="<?php echo $result['id'] ?>" /><input type="text" name="title" value="<?php echo $result['title']; ?>"/></td></tr><tr><td>新闻内容</td><td><textarea rows="3" cols="14" name="content"><?php echo $result['content']; ?></textarea></td></tr><tr><td><input type="submit" name="submit" value="修改"/></td></tr></table></form>
</body>
</html>
includes-->parser.class.php:
代码:
<?php
/*** 模板解析类*/
class Parser
{//存储模板内容private $_tplcontent;/*** 构造函数,获取模板内容*/public function __construct($_tplPath){if ( !$this->_tplcontent = file_get_contents($_tplPath) ) {exit('ERROR:获取模板文件出错!');}}/*** 解析普通变量*/private function parVar(){//替换变量的正则表达式$_patten = '/\{\$([\w]+)\}/';//如果匹配成功,则替换变量if ( preg_match($_patten, $this->_tplcontent) ) {//[ \1 ],正则表达式,得到替换的内容。$this->_tplcontent = preg_replace($_patten, '<?php echo $this->_vars["\1"];?>', $this->_tplcontent);} else {exit($this->_tplcontent);}}/*** 解析if语句*/private function parIf(){$_varStartIf = '/\{if\s+\(\$([\w]+)\)\}/';$_varMidlleElse = '/\{else\}/';$_varEndIf = '/\{\/if\}/';if ( preg_match($_varStartIf, $this->_tplcontent) ) {if (preg_match($_varEndIf, $this->_tplcontent) ) {//替换头if$this->_tplcontent = preg_replace($_varStartIf, '<?php if ($this->_vars["\1"]) { ?>', $this->_tplcontent);//替换尾if$this->_tplcontent = preg_replace($_varEndIf, '<?php } ?>', $this->_tplcontent);//替换 elseif ( preg_match($_varMidlleElse, $this->_tplcontent) ) {$this->_tplcontent = preg_replace($_varMidlleElse, '<?php } else { ?>', $this->_tplcontent);}} else {exit('ERROR:if语句没有关闭!');}}}/*** 解析Foreach语句*/private function parForeach(){$_pattenStartForeach = '/\{foreach\s+\$([\w]+)\(([\w]+),([\w]+)\)\}/';$_pattenMiddleForeach = '/\{@([\w]+)\}/';$_pattenEndForeach = '/\{\/foreach\}/';if ( preg_match($_pattenStartForeach, $this->_tplcontent) ) {if ( preg_match($_pattenEndForeach, $this->_tplcontent) ) {//替换开头和结尾$this->_tplcontent = preg_replace($_pattenStartForeach, '<?php foreach ($this->_vars["\1"] as $\2=>$\3) { ?>', $this->_tplcontent);$this->_tplcontent = preg_replace($_pattenEndForeach, '<?php } ?>', $this->_tplcontent);//替换中间内容if ( preg_match($_pattenMiddleForeach, $this->_tplcontent) ) {$this->_tplcontent = preg_replace($_pattenMiddleForeach, '<?php echo $\1; ?>', $this->_tplcontent);}} else {exit('ERROR:foreach标签没有关闭!');}}}/*** 解析include语句*/private function parInclude(){$_pattenInclude = '/\{#include\s+file=\"([\w\.\-]+)\"\}/';if ( preg_match($_pattenInclude, $this->_tplcontent,$_file) ) {//判断被包含文件是否存在if ( !file_exists($_file[1]) || empty($_file[1]) ) {exit('ERROR:包含文件出错!');}//替换为PHP代码$this->_tplcontent = preg_replace($_pattenInclude, '<?php include "\1"; ?>', $this->_tplcontent);}}/*** 解析系统变量*/private function parConfig(){$_pattenConfig = '/<!--\{([\w]+)\}-->/';if (preg_match($_pattenConfig, $this->_tplcontent) ) {$this->_tplcontent = preg_replace($_pattenConfig, '<?php echo $this->_config["\1"]; ?>', $this->_tplcontent);}}/*** 解析注释*/private function parCommon(){$_patten = '/\{#\}(.*)\{#\}/';if ( preg_match($_patten, $this->_tplcontent) ) {$this->_tplcontent = preg_replace($_patten, '<?php /* \1 */ ?>', $this->_tplcontent);}}/*** 调用各个解析方法解析文件,并最终生成编译文件*/public function compile($_compileName){//解析普通变量$this->parVar();//解析if语句$this->parIf();//解析include$this->parInclude();//解析系统变量$this->parConfig();//解析注释$this->parCommon();//解析foreach$this->parForeach();//经过解析变量,最后生成编译文件if ( !file_put_contents($_compileName, $this->_tplcontent) ) {exit('ERROR:编译文件出错!');}}
}
?>
inlcudes-->Templates.class.php:
代码:
<?php
/*** 模板类*/
class Templates
{//存储注入的变量private $_vars = array();/*** 构造函数*/public function __construct(){//验证各个目录是否存在if ( !is_dir(TPL_DIR) || !is_dir(CACHE) ) {exit('ERROR:目录不存在,请添加!');}}/*** 注入变量*/public function assign($_varName, $_varValue){//判断变量名称是否为空if ( !isset($_varName) || empty($_varName) ) {exit('ERROR:变量名不能为空!');} else {//将变量注入到数组中去$this->_vars[$_varName] = $_varValue;}}/*** 显示模板文件*/public function display($filename,$id){//获取模板路径$_tplPath = TPL_DIR . $filename;//判断模板文件是否存在if ( !file_exists($_tplPath) ) {exit('ERROR:模板文件不存在!');}//编译后文件的文件名$_compileName = CACHE . 'News_id' . $id . '.php';//缓存文件的文件名$_cacheFileName = CACHE . 'News_id' . $id . '.html';//引入解析类,将模板文件中的伪代码,解析为php代码,并生成编译文件。require ROOT_PATH . 'includes' . DIRECTORY_SEPARATOR . 'Parser.class.php';//声明类的时候,传入模板文件路径$parser = new Parser($_tplPath);//调用解析方法的时候,传入编译文件名称$parser->compile($_compileName);//载入生成的编译文件。载入后输出内容输出到浏览器,ob缓存进行读取。include $_compileName;//是否开启了缓存if ( IS_CACHE ) {//接受缓冲文件,并生成缓存文件file_put_contents($_cacheFileName, ob_get_contents());//清除缓冲区,并关闭缓存,意思就是清除了编译文件加载的内容。ob_end_clean();//删除编译文件if ( file_exists($_compileName) ) {if ( !unlink($_compileName) ) {exit('编译文件未能及时删除,可能会造成服务器空间浪费,但不影响正常使用。');}}}}
}
?>
templates-->details.tpl:
代码:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd"><html>
<head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>新闻显示</title><style type="text/css">.border, .border tr td{border:1px solid #888;}</style>
</head>
<body><table class="border"><tr><td>新闻标题</td><td>新闻内容</td></tr><tr><td>{$title}</td><td>{$content}</td></tr></table>
</body>
</html>
----------------项目源码:网盘-->smarty文件夹下,文件名称:【静态化-真静态】
转载于:https://www.cnblogs.com/KTblog/p/5161245.html
静态化 - 真静态技术相关推荐
- PHP 页面静态化/纯静态化/伪静态化
转载:https://www.cnblogs.com/caoruiy/p/4698938.html 概念 PHP静态化分为:纯静态化 和 伪静态化:纯静态化又分为:局部静态化 和 完全静态化 纯静态化 ...
- PHP 实现全站静态化 首页静态化 列表页静态化 内容静态化 .
首先先要把需要静态话的内容发到模版上去 eg.这个是静态化首页的 function staticIndex(){ $newslist = $article->getArticles(null,5 ...
- 页面静态化之FreeMarker技术
在Eclipse工具中使用FreeMarker 点击Window,选择preference,弹出如下框 找到:General–Editors–File Associations 如下,如果有*.ftl ...
- 网站提速-页面静态化(2)
第一篇.页面静态化 页面静态化概念 我们大多数情况下是直接访问php文件,php脚本在服务器端执行并 返回信息,对于一些大型的网站,访问量很大,频繁的动态操作和操作 数据库会加重服务器的负担.在实际开 ...
- 大型网站架构提速关键技术(页面静态化、memcached、Mysql优化)
大型网站关键技术介绍 1. pv值(page views),访问量大 带来问题 a. 流量大 10000000*2m ->解决方案 买带宽 ,优化程序(处理图片) b. 并发量,同时访问网站的人 ...
- 网站优化---页面静态化技术
一: 首先先区分一下动态页面和静态页面的区别 动态文件:PHP脚本.Java脚本等 动态文件的执行过程:词法.语法分析 -> 编译 -> 渲染输出 静态文件:HTML文件 从加载速度上可以 ...
- 关于大型网站技术演进的思考--网站静态化处理
转自: 夏天的森林blog:(系统设计与架构(47)) 一 在存储瓶颈的开篇我提到像hao123这样的导航网站只要它部署的web服务器数量足够,它可以承载超大 规模的并发访问量,如果是一个动态的网站, ...
- 关于大型网站技术演进的思考(九)--网站静态化处理--总述(1)
在存储瓶颈的 开篇我提到像hao123这样的导航网站只要它部署的web服务器数量足够,它可以承载超大规模的并发访问量,如果是一个动态的网站,特别是使用到了数据 库的网站是很难做到通过增加web服务器数 ...
- 一步一步asp.net_页面静态化管理
最近事情多,中间还生病了一次,纠结,最近一年来都没有什么毛病,不知道咋了...头痛..... 今天闲下来写篇日志,页面静态化. 页面静态化是我们经常碰到的问题,在web中,要说速度,只有html静态页 ...
最新文章
- 如何设计一个复杂的业务系统?从对领域设计、云原生、微服务、中台的理解开始...
- 强势 图解 AC自动机(保证您一次就能学会!)
- iphonex如何关机_iPhone X手机屏幕出现绿线怎么回事_屏幕绿线该如何处理?
- 用 Chiron 运行 IronPython 编写的 Silverlight 程序
- JS 动态添加 onload、onresize、onscroll 事件
- 【错误记录】Android Studio 编译报错 ( VirtualApp 编译 NDK 报错 | Error:A problem occurred configuring project ‘: )
- Kosaraju 算法查找强连通分支
- Struts2之类型转换
- unity 中的UGUI 屏蔽鼠标穿透
- 前后端分手大师——MVVM 模式
- 如何让计算机两个用户使用不同步,如何实现两台或多台电脑远程修改文件同步更新?...
- 数据:以太坊2.0合约新增8032 ETH
- 与Xcode相比Adobe AIR开发iOS的优势和局限
- cad解除块的快捷命令_cad退出块编辑_cad常用快捷键命令表_cad打印快捷键
- android 虚拟wifi定位,基于Android手机的WiFi定位系统设计
- linux 进程 清理,Linux僵尸进程清除方法
- 计算机网络ip地址分类的范围,ip地址分类及范围_ip地址由什么组成
- Solr实现全文检索
- 数据库事务Transaction)那点事
- 企业自动化运维ansible
热门文章
- 关于对象和类的那些小事
- 使用truffle 创建代币合约 使用ganache部署私有链 以及使用Atom 进行合约代码开发
- 数据意识崛起,从企业应用看BI软件的未来发展
- web报表工具FineReport常见的数据集报错错误代码和解释
- nginx上安装mysql 性能_Linux安装Mysql及Nginx详细步骤
- php筛选怎么做,thinkphp条件筛选 例子
- python 求 gamma 分布_python如何生成各种随机分布图
- 5在ios上无法选取文件_无法在 Ubuntu 20.04 上安装 Deb 文件?这是你需要做的! | Linux 中国...
- redis key失效的事件_Redis常见、常用的知识点
- python中set index_python pandas DataFrame.set_index用法及代码示例