静态化,真静态技术。

采用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

静态化 - 真静态技术相关推荐

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

    转载:https://www.cnblogs.com/caoruiy/p/4698938.html 概念 PHP静态化分为:纯静态化 和 伪静态化:纯静态化又分为:局部静态化 和 完全静态化 纯静态化 ...

  2. PHP 实现全站静态化 首页静态化 列表页静态化 内容静态化 .

    首先先要把需要静态话的内容发到模版上去 eg.这个是静态化首页的 function staticIndex(){ $newslist = $article->getArticles(null,5 ...

  3. 页面静态化之FreeMarker技术

    在Eclipse工具中使用FreeMarker 点击Window,选择preference,弹出如下框 找到:General–Editors–File Associations 如下,如果有*.ftl ...

  4. 网站提速-页面静态化(2)

    第一篇.页面静态化 页面静态化概念 我们大多数情况下是直接访问php文件,php脚本在服务器端执行并 返回信息,对于一些大型的网站,访问量很大,频繁的动态操作和操作 数据库会加重服务器的负担.在实际开 ...

  5. 大型网站架构提速关键技术(页面静态化、memcached、Mysql优化)

    大型网站关键技术介绍 1. pv值(page views),访问量大 带来问题 a. 流量大 10000000*2m ->解决方案 买带宽 ,优化程序(处理图片) b. 并发量,同时访问网站的人 ...

  6. 网站优化---页面静态化技术

    一: 首先先区分一下动态页面和静态页面的区别 动态文件:PHP脚本.Java脚本等 动态文件的执行过程:词法.语法分析 -> 编译 -> 渲染输出 静态文件:HTML文件 从加载速度上可以 ...

  7. 关于大型网站技术演进的思考--网站静态化处理

    转自: 夏天的森林blog:(系统设计与架构(47)) 一 在存储瓶颈的开篇我提到像hao123这样的导航网站只要它部署的web服务器数量足够,它可以承载超大 规模的并发访问量,如果是一个动态的网站, ...

  8. 关于大型网站技术演进的思考(九)--网站静态化处理--总述(1)

    在存储瓶颈的 开篇我提到像hao123这样的导航网站只要它部署的web服务器数量足够,它可以承载超大规模的并发访问量,如果是一个动态的网站,特别是使用到了数据 库的网站是很难做到通过增加web服务器数 ...

  9. 一步一步asp.net_页面静态化管理

    最近事情多,中间还生病了一次,纠结,最近一年来都没有什么毛病,不知道咋了...头痛..... 今天闲下来写篇日志,页面静态化. 页面静态化是我们经常碰到的问题,在web中,要说速度,只有html静态页 ...

最新文章

  1. 如何设计一个复杂的业务系统?从对领域设计、云原生、微服务、中台的理解开始...
  2. 强势 图解 AC自动机(保证您一次就能学会!)
  3. iphonex如何关机_iPhone X手机屏幕出现绿线怎么回事_屏幕绿线该如何处理?
  4. 用 Chiron 运行 IronPython 编写的 Silverlight 程序
  5. JS 动态添加 onload、onresize、onscroll 事件
  6. 【错误记录】Android Studio 编译报错 ( VirtualApp 编译 NDK 报错 | Error:A problem occurred configuring project ‘: )
  7. Kosaraju 算法查找强连通分支
  8. Struts2之类型转换
  9. unity 中的UGUI 屏蔽鼠标穿透
  10. 前后端分手大师——MVVM 模式
  11. 如何让计算机两个用户使用不同步,如何实现两台或多台电脑远程修改文件同步更新?...
  12. 数据:以太坊2.0合约新增8032 ETH
  13. 与Xcode相比Adobe AIR开发iOS的优势和局限
  14. cad解除块的快捷命令_cad退出块编辑_cad常用快捷键命令表_cad打印快捷键
  15. android 虚拟wifi定位,基于Android手机的WiFi定位系统设计
  16. linux 进程 清理,Linux僵尸进程清除方法
  17. 计算机网络ip地址分类的范围,ip地址分类及范围_ip地址由什么组成
  18. Solr实现全文检索
  19. 数据库事务Transaction)那点事
  20. 企业自动化运维ansible

热门文章

  1. 关于对象和类的那些小事
  2. 使用truffle 创建代币合约 使用ganache部署私有链 以及使用Atom 进行合约代码开发
  3. 数据意识崛起,从企业应用看BI软件的未来发展
  4. web报表工具FineReport常见的数据集报错错误代码和解释
  5. nginx上安装mysql 性能_Linux安装Mysql及Nginx详细步骤
  6. php筛选怎么做,thinkphp条件筛选 例子
  7. python 求 gamma 分布_python如何生成各种随机分布图
  8. 5在ios上无法选取文件_无法在 Ubuntu 20.04 上安装 Deb 文件?这是你需要做的! | Linux 中国...
  9. redis key失效的事件_Redis常见、常用的知识点
  10. python中set index_python pandas DataFrame.set_index用法及代码示例