实现静态化

一、内容回顾

实现静态化的方式:

真静态:使用ob缓存方式,使用模板替换,

ob_start();//开启o b缓存

ob_clean();//清除o b缓存里面的数据,并不关闭ob缓存。

ob_end_clean();//清除ob 缓存里面的数据,并关闭ob缓存

ob_flush();//把ob缓存里面的数据移动(刷新)到程序缓存,不关闭ob缓存。

ob_end_flush();//把ob缓存里面的数据移动到程序缓存,并关闭ob缓存。

ob_get_contents();//获取ob缓存里面的内容。

?

?

在判断缓存有效期:生成的静态页面最后的修改时间戳+缓存时间>当前时间戳

filemtime($filename)+300>time();

?

ab.exe

ab.exe –n 请求的总的次数 -c并发数 测试的地址。

mpm:多路处理模块(apache处理并发的方式)主要是预派生模型,工作者模型,winnt模型。

查看当前apache的mpm:httpd.exe –l

?

?

在程序缓存里面,存储的是,先存储头信息,然后,是页面的主体信息。存储了主体信息,再存储(修改)头信息,则会出现警告错误。

?

二、如何配置缓存:

把一些更新不是很频繁的数据,缓存到本地。下次再请求网站的时候,则直接从本地取出,无需从服务器里取出。

基本图示:

1、缓存的原理:

第一次访问头信息:

第二次访问:

?

2、如何配置缓存

?

(1)打开apache的主配置文件(httpd.conf)开启缓存模块

打开apache的expires扩展,利用该扩展控制图片,css,html等文件控制缓存是否缓存,及缓存声明周期。

(2)配置选项设置

?

ExpiresActive On //开启缓存设置

//具体的针对文件类型设置缓存规则。

ExpiresDefault "<base> [plus] {<num> <type>}*"//默认设置
ExpiresByType type/encoding "<base> [plus] {<num> <type>}*"//针对不同文件类型进行设置。

?

?

?

(3)具体的配置步骤:

为了测试:新建一个虚拟主机:

?

?

?

思考:如果我们想要对js文件配置缓存周期,如果设置文件的类型。

可以在页面中引入某个文件,比如:

通过浏览器刷新该页面,查看头信息:

?

expiresbytype application/javascript "access plus 10 days"

?

3、可以针对某些文件,不让他缓存,始终从服务器中获取内容。

比如案例:不缓存gif文件。

思路,打开apache主配置文件,中header模块,配置该选项:cache-control:no-store,must-revalidate,

具体 的步骤:

(1)开启header模块。

(2)具体的配置:思路是针对gif格式的文件。

在虚拟主机里面进行如下配置:

(3)效果:

三、配置压缩

如何查看浏览器支持的压缩格式:可以通过请求头信息里面accept-encoding选项查看浏览器支持的压缩格式。

?

如常见的gzip压缩,deflate压缩,compress压缩以及google、chrome正在推的sdcn压缩。

?

具体的配置步骤:

(1)在apache的主配置文件中,开启压缩配置,apache默认是deflate压缩。

(2)在虚拟主机里面配置。

(3)开始测试:

文件本身的长度:

压缩前的长度:

?

压缩后的长度:

?

四、完成一个真静态的一个案例

(通过新闻列表,单击新闻详情,跳转到具体的新闻页面,该具体的新闻页面完成真静态)

原理图:

思路:主要有如下几个页面。

addnews.html:新闻添加页面(有表单)

action.php:新闻处理页面(比如添加,修改,删除)

index.php:新闻列表页面

newsinfo:新闻详情页面。

?

(1)新建一个新闻的表:

?

?

?

?

?

?

(2)新建一个添加新闻的页面:

(3)新建一个action.php页面完成入库

(4)完成首页(列表页面)

<?php

$conn = mysql_connect("localhost",‘root‘,‘root‘);

mysql_query("use php");

mysql_query("set names utf8");

?

$sql="select id,title from news";

$list=array();

$res = mysql_query($sql,$conn);

while($row=mysql_fetch_assoc($res)){

$list[]=$row;

}

?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" lang="zh-CN">

<head>

<title>新建网页</title>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<meta name="description" content="" />

<meta name="keywords" content="" />

<script type="text/javascript">

?

</script>

?

<style type="text/css">

</style>

</head>

<body>

<h1>新闻列表页面</h1>

<table width="500" border="1">

<tr><td>新闻标题</td><td>新闻详情</td><td>操作</td></tr>

<?php foreach($list as $v){?>

<tr><td><?php echo $v[‘title‘]?></td><td>新闻详情</td><td>操作</td></tr>

<?php }?>

</table>

</body>

</html>

(5)在列表页面,给新闻详情添加超级链接

(6)给新闻详情页面生成静态页面。

<?php

//接收传递过来的id

$id = $_GET[‘id‘]+0;

//给对应的静态页面命名

$filename = "news_id".$id.‘.html‘;

//echo $filename;

//添加判断

if(file_exists($filename) && filemtime($filename)+300>time()){

//echo ‘99999999‘;

include $filename;exit;

}

$conn = mysql_connect("localhost",‘root‘,‘root‘);

mysql_query("use php");

mysql_query("set names utf8");

$sql="select title,content from news where id = $id";

$res = mysql_query($sql,$conn);

$row=mysql_fetch_assoc($res);

ob_start();

?>

?

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" lang="zh-CN">

<head>

<title>新建网页</title>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<meta name="description" content="" />

<meta name="keywords" content="" />

<script type="text/javascript">

?

</script>

?

<style type="text/css">

</style>

</head>

<body>

<h1>新闻的详情页面</h1>

<h3><?php echo $row[‘title‘]?></h3>

<hr>

<div><?php echo $row[‘content‘]?></div>

</body>

</html>

<?php

$str = ob_get_contents();

file_put_contents($filename,$str);

?>

?

缺点:该新闻详情页面,即使没有修改,也是每隔5分钟要重新生成一次。可以做成,只要新闻没有修改,则一直使用静态页面,如果新闻更改了则立刻重新生成一个对应的静态页面。

五、使用模板替换技术来完成真静态:

?

思路:

在添加新闻的时候,生成对应的静态页面。

在修改新闻的时候,重新生成对应的静态页面。

让新闻列表页面的链接直接链接对应生成的静态页面。

原理图:

具体的步骤;

(1)新建一个模板文件,tpl.html:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" lang="zh-CN">

<head>

<title>新建网页</title>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<meta name="description" content="" />

<meta name="keywords" content="" />

<script type="text/javascript">

?

</script>

?

<style type="text/css">

</style>

</head>

<body>

<h1>新闻的详情页面</h1>

<h3>%title%</h3>

<hr>

<div>%content%</div>

</body>

</html>

(2)修改action.php页面

if($act==‘add‘){

//接收表单提交过来数据

$title = $_POST[‘title‘];

$content = $_POST[‘content‘];

$sql="insert into news(title,content) values(‘$title‘,‘$content‘)";

$res = mysql_query($sql,$conn);

$id = mysql_insert_id($conn);

if(!$id){

die("添加失败");

}

//完成生成静态页面

//给对应的静态页面命名

$filename = ‘news_id‘.$id.‘.html‘;

//打开模板文件

$tpl_ph=fopen(‘tpl.html‘,‘r‘);

//创建对应的静态页面。

$file_ph=fopen($filename,‘w‘);

//完成替换

//feof()函数,返回文件指针是否到文件的末尾,如果到则返回的真。

while(!feof($tpl_ph)){

$row=fgets($tpl_ph);//fgets()函数是读取一行内容

$row=str_replace(‘%title%‘,$title,$row);//str_replace()该函数返回替换之后的结果

$row=str_replace(‘%content%‘,$content,$row);

fwrite($file_ph,$row);//把替换之后的内容,写入到$filename文件中。

}

fclose($tpl_ph);//关闭文件指针

fclose($file_ph);//关闭文件指针

echo ‘添加成功‘;

echo "<a href=‘index.php‘>返回首页</a>";

}

(3)修改新闻的列表页面,把新闻的详情链接修改成对应的静态页面。

?

?

(4)修改新闻时则重新生成对应的静态页面。

(3)删除新闻的时候,则要删除对应的静态页面。unlink

?

缺点:

(1)如果新闻比较多,则生成的静态页面比较多,应该采用分层存储静态页面。

(2)还没有达到全站静态化,我们应该让首页面生成静态页面,达到全站静态化。

(3)把生成的静态页面的路径添加到数据库的字段中。

?

六、使用模板替换技术完成真静态,进一步完善

一个项目有前台和后台,全站静态化是针对的前台,

?

案例规划:

?

?

?

(1)复制上午的项目(demo1),把文件移动到admin目录中。

目标:创建生成的静态页面的路径,创建数据库中filename字段的存储路径

?

<?php

$act = isset($_GET[‘act‘])?trim($_GET[‘act‘]):"";

$conn = mysql_connect("localhost",‘root‘,‘root‘);

mysql_query("use php");

mysql_query("set names utf8");

//添加新闻

if($act==‘add‘){

//接收表单提交过来数据

$title = $_POST[‘title‘];

$content = $_POST[‘content‘];

$sql="insert into news(title,content) values(‘$title‘,‘$content‘)";

$res = mysql_query($sql,$conn);

$id = mysql_insert_id($conn);

if(!$id){

die("添加失败");

}

$dir = date("Ym/d");

$file="news_id".$id.‘.html‘;//表示生成的静态文件的名称

$dir_path="../a/".$dir;

//要判断$dir_path目录是否存在,如果不存在则创建。

if(!is_dir($dir_path)){

mkdir($dir_path,0777,true);

}

$filename =$dir_path.‘/‘.$file; //生成的静态文件的完整路径;

$filename_path="./a/".$dir.‘/‘.$file;//存储到数据库filename字段中的静态页面的路径:

//打开模板文件

$tpl_ph=fopen(‘tpl.html‘,‘r‘);

//创建对应的静态页面。

$file_ph=fopen($filename,‘w‘);

//完成替换

//feof()函数,返回文件指针是否到文件的末尾,如果到则返回的真。

while(!feof($tpl_ph)){

$row=fgets($tpl_ph);//fgets()函数是读取一行内容

$row=str_replace(‘%title%‘,$title,$row);//str_replace()该函数返回替换之后的结果

$row=str_replace(‘%content%‘,$content,$row);

fwrite($file_ph,$row);//把替换之后的内容,写入到$filename文件中。

}

fclose($tpl_ph);//关闭文件指针

fclose($file_ph);//关闭文件指针

?

//把生成的对应静态页面的路径存储到数据库里面的filename字段

$sql="update news set filename=‘$filename_path‘ where id=$id";

$res = mysql_query($sql);

$num = mysql_affected_rows($conn);

if(!$num){

die("失败");

}

echo ‘添加成功‘;

echo "<a href=‘index.php‘>返回首页</a>";

}

?>

?

(2)完成后台的首页。

?

(3)新建一个makehtml.php页面完成,前台首页的生成。

?

<?php

$conn = mysql_connect("localhost",‘root‘,‘root‘);

mysql_query("use php");

mysql_query("set names utf8");

?

$sql="select id,title,filename from news";

$list=array();

$res = mysql_query($sql,$conn);

while($row=mysql_fetch_assoc($res)){

$list[]=$row;

}

ob_start();

?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" lang="zh-CN">

<head>

<title>新建网页</title>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<meta name="description" content="" />

<meta name="keywords" content="" />

<script type="text/javascript">

?

</script>

?

<style type="text/css">

</style>

</head>

<body>

<h1>新闻列表页面</h1>

?

<table width="500" border="1">

<tr><td>新闻标题</td><td>新闻详情</td><td>操作</td></tr>

<?php foreach($list as $v){?>

<tr><td><?php echo $v[‘title‘]?></td><td><a href="<?php echo $v[‘filename‘]?>">新闻详情</a></td><td>操作</td></tr>

<?php }?>

</table>

</body>

</html>

<?php

$str = ob_get_contents();

file_put_contents("../index.html",$str);

ob_clean();

echo "首页已经已经生成 <a href=‘../index.html‘>返回前台首页</a>";

?>

(4)测试效果:

?

七、真静态的优缺点说明:

优点: 1. 速度快 2. 安全性高 3. 利于seo

缺点:就是占有磁盘空间., 如果过大,对磁盘响应速度有影响

在什么情况下,建议不要使用真静态

  1. 页面的数据更新频繁,最好不要使用真静态(比如股票,基金,等实时报价系统)
  2. 会生成海量页面(比如大型论坛 bbs ,csdn)
  3. 查询该页面一次后,以后再也不查询该页面.
  4. 不愿意被搜索引擎抓取的页面.
  5. 访问量小的页面.

八、伪静态,使用正则匹配来完成伪静态。

实现的方式:使用正则匹配,通过apache的rewrite机制。

?

基本图示:

具体的步骤:复制上午的案例dome改成demo3.

(1)打开index.php页面把新闻详情的链接改成<a href=‘newsinfo.php/news_id88.html‘>新闻详情</a>

(2)修改newsinfo.php页面。

<?php

$path_info = $_SERVER[‘PATH_INFO‘];//获取到 地址中:news_id1.html

$patt = ‘/news_id(\d{1,3})\.html$/‘;

preg_match($patt,$path_info,$a);//$a用于存储匹配到的内容。

$id = $a[1];

$conn = mysql_connect("localhost",‘root‘,‘root‘);

mysql_query("use php");

mysql_query("set names utf8");

$sql="select title,content from news where id = $id";

$res = mysql_query($sql,$conn);

$row=mysql_fetch_assoc($res);

?>

?

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" lang="zh-CN">

<head>

<title>新建网页</title>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<meta name="description" content="" />

<meta name="keywords" content="" />

<script type="text/javascript">

?

</script>

?

<style type="text/css">

</style>

</head>

<body>

<h1>新闻的详情页面</h1>

<h3><?php echo $row[‘title‘]?></h3>

<hr>

<div><?php echo $row[‘content‘]?></div>

</body>

</html>

?

九、使用rewrite机制,完成伪静态。

1、rewrite机制的使用原理

2、rewrite机制的具体配置:

(1)打开apahce的主配置文件(httpd.conf),开启rewrite模块。

(2)为了测试,新建一个虚拟主机,使用上午创建的。

(3)入门案例:请求abc.html转换成请求123.php,在虚拟主机目录下面建立该两个文件。

具体的配置内容:

?

3、虚拟主机里面常用的配置。

(1)#配置是否显示文件目录:[indexes|none]

Options indexes FollowSymLinks //配置显示文件目录,如果没有配置欢迎页面。

?

如果配置成 options none

(2)配置错误跳转页面。主要防止用户请求的页面不存在,如果用户访问的页面不存在,则给一个友好的提示。

(3)配置欢迎页面,也就是访问域名时默认执行页面。

?

#配置网站的欢迎页面:

DirectoryIndex abc.html

?

?

4、完成一个案例:

比如请求的url

http://www.abc.com/news-music-id100.html

转换成请求:news.php?type=music&id=100页面,或news.php?type=sport&id=100

具体的配置:

效果:

5、可以新建一个.htaccess文件,具体的内容可以在该文件进行配置。

要注意:要使该文件有效,则必须在虚拟主机里面设置。AllowOverride All

(1)新建一个.htaccess文件,

可以通过编辑器来另存为创建一个.htaccess文件。

就可以把一些配置选项在里面完成。

(2)在该文件中定义重写规则

?

6、通过使用rewrite机制完成一个防盗链案例。

?

主要原理:利用referer头信息,

?

具体的配置:

时间: 2024-10-23 07:25:55

实现静态化的相关文章

java 企业网站源码 后台 springmvc SSM 前台 静态化 代码生成器

java 企业网站源码 前后台都有 静态模版引擎, 代码生成器大大提高开发效率 点击:获取地址 QQ 313596790 系统介绍: 1.网站后台采用主流的 SSM 框架 jsp JSTL,网站后台采用freemaker静态化模版引擎生成html 2.因为是生成的html,所以访问速度快,轻便,对服务器负担小 3.网站前端采用主流的相应式布局,支持PC.平板.手机浏览器访问 4.springmvc +spring4.2.5+ mybaits3.3  SSM 普通java web(非maven) 

动态网页静态化+局部静态化

静态化: 1.设置缓存时间 if(is_file('./index.html') && (time()-filemtime('./index.html') < 1200)) { require_once('./index.html'); }else { // 引入数据库链接操作 require_once('./db.php'); $sql = "select * from news where `category_id` = 1 and `status` = 1 limit

Freemarker 之 Java静态化 实例一

Freemarker是一种强大的web端模板技术,在当前Web开发中,SEO和客户端浏览速度尤为重要,其中将网页静态化是一个很好的解决方案.下面介绍Java中web开发结合Freemarker来实现静态化. 主要分为三步 1 准备好模板文件,如Test.ftl <html> <head> <title>${title}</title> <style type="text/css" link="${rccontextPath

小蚂蚁学习页面静态化(2)——更新生成纯静态化页面的三种方式

更新生成纯静态化页面的三种方式:1.按照时间间隔更新.2.手动更新.3.定时更新(需要系统配合). 1. 按照时间间隔更新. 当用户第一次访问这个页面的时候,程序自动判断,该静态文件是否存在,并且该文件是否还在有效时间内,如果该文件未超出了有效时间,用户访问的是已经生成的静态文件.如果超出了有效时间,用户得到的是动态输出的内容,同时重新生成静态文件.稍微修改一下昨天的代码为例: <?php //首先判断是否有静态文件,并且文件的最新修改时间到现在是否大于20秒 if(is_file('./tex

浅谈——页面静态化

现在互联网发展越来越迅速,对网站的性能要求越来越高,也就是如何应对高并发量.像12306需要应付上亿人同时来抢票,淘宝双十一--所以,如何提高网站的性能,是做网站都需要考虑的. 首先网站性能优化的方面有很多:1,使用缓存,最传统的一级二级缓存:2,将服务和数据库分开,使用不同的服务器,分工更加明确,效率更加高:3,分布式,提供多台服务器,利用反向代理服务器nginx进行反向代理,将请求分散开来:4,数据库的读写分离,不同的数据库,将读操作和写操作分开,并实时同步即可:5,分布式缓存,使用memc

java自适应响应式 企业网站源码 SSM 生成静态化 手机 平板 PC

java 企业网站源码 前后台都有 静态模版引擎, 代码生成器大大提高开发效率 点击:获取地址 QQ 313596790 系统介绍: 1.网站后台采用主流的 SSM 框架 jsp JSTL,网站后台采用freemaker静态化模版引擎生成html 2.因为是生成的html,所以访问速度快,轻便,对服务器负担小 3.网站前端采用主流的相应式布局,支持PC.平板.手机浏览器访问 4.springmvc +spring4.2.5+ mybaits3.3  SSM 普通java web(非maven) 

java 企业网站源码模版 有前后台 springmvc SSM 生成静态化

java 企业网站源码 前后台都有 静态模版引擎, 代码生成器大大提高开发效率 点击:获取地址 QQ 313596790 系统介绍: 1.网站后台采用主流的 SSM 框架 jsp JSTL,网站后台采用freemaker静态化模版引擎生成html 2.因为是生成的html,所以访问速度快,轻便,对服务器负担小 3.网站前端采用主流的相应式布局,支持PC.平板.手机浏览器访问 4.springmvc +spring4.2.5+ mybaits3.3  SSM 普通java web(非maven) 

ThinkPHP的静态化页面方法

原来ThinkPHP自带了生成静态页的函数buildHtml,使用起来很方便!最新的手册里没写这个方法,向大家介绍一下.     protected function buildHtml($htmlfile='',$htmlpath='',$templateFile='') {         $content = $this->fetch($templateFile);         $htmlpath   = !empty($htmlpath)?$htmlpath:HTML_PATH;  

Freecms模板的制作与静态化 (3)

这里简单说一下文章页的静态化. FreeCMS用的是ckEditor编辑文章,编辑得到的东西和标题等信息,一并存到freecms_info这张表中. 每个文章都有对应的栏目,多数栏目,都有相应的模版文件,这些东西,存在freecms_channel这张表中. 文章页静态化的时候,通过info查找到channel,然后对应相关的template,插入数据后,把静态化的页面存到相应的文件夹中.文件的路径不支持别名等,暂时的命名方法是 /栏目/info/年份/文章号.html.如果想自己做别名,需要改

CMS系统关键技术点总结(UrlRewrite、批量静态化、发送邮件)

1.UrlRewrite 1 protected void Application_BeginRequest(object sender, EventArgs e) 2 { 3 //将请求的ShowArticle页面进行url重写 4 string url = HttpContext.Current.Request.AppRelativeCurrentExecutionFilePath; 5 Match match = Regex.Match(url, @"~/Article/ShowArtic