页面静态化

一、真静态和伪静态

1、概念

PHP静态化分为:真静态化和伪静态化。真静态化又分为:局部静态化(ajax)和完全静态化(html)。

 

真静态化:是指由动态语言如phpjava等生成的动态页面保存为静态的html文件。当用户再次访问相同的url地址的时候,直接访问生成的html静态文件即可,最大优点就是减轻服务器(mysql)的开销。(mysql磁盘最大的瓶颈在磁盘i/o

 

局部静态化:指生成的静态文件中,有些局部的数据还是通过Ajax技术动态获取的。

完全静态化:即不存在动态获取的内容,所有内容均来自静态的html文件。

 

伪静态化:实质还是访问动态文件,只是访问的url网址看起来是一个静态的地址。

如:访问地址”http://www.abc.com/index/100”,实际此地址经过服务器解析之后(通过rewrite重写机制),最终访问的地址解析成类似于:http://www.abc.com/index.php?id=100

 

2、真伪静态的优缺点分析

真静态(真实html文件)的优缺点:

优点:①速度快,因为加载的时候不需要调用数据库,响应速度快。

  ②安全性高,从安全的角度讲,静态网页不易遭受黑客的攻击。

     ③有利于seoseo优化),有利于搜索引擎收录。(网址越短,越容易被搜索引擎搜录)

 

缺点:大量的生成静态文件占用磁盘空间,对磁盘的响应速度(i/o)有影响。(redis,nginx,memcahe)

 

伪静态(假的html)的优缺点:

优点:①易于被搜索引擎收录。

  ②缩短了url的长度,隐藏了文件的实际路径提高了安全性,也易于记忆和输入。

  ③占用空间小,不想真静态那样占用磁盘空间

缺点:最大的缺点就是会占用一定量的cpu占有率,降低服务器响应的时间(主要是磁盘i/o影响)

 

问:在什么情况下不要使用真静态

答:①页面的数据更新比较频繁,最好不要使用真静态(如股票、基金等实时报价系统)

②会生成海量页面(如大型论坛等网站),降低服务器响应的时间(主要是磁盘i/o影响)

③查询该页面一次后,以后再也不查询该页面

④不愿意被搜索引擎抓取的页面

⑤访问量小的页面

 

使用真静态也需要看网站并发量,一般是针对于某个网页转化为真静态。真静态只是其中一种解决办法,后面还有一些其他的技术(redismemcachemysql读写分离)也可以解决网站并发量大的问题

 

 

二、伪静态的实现

1、需求

在实际的项目开发中,如果我们的页面不适合使用真静态技术,但是又希望页面安全性高和同时利于seo,这种情况下我们可以考虑使用伪静态的技术。

使用技术:利用Apache服务器的rewrite重写机制实现

 

2、开启apache的伪静态配置

1、修改apachehttpd.conf配置文件,开启rewrite重写模块

 

 

2、配置一个虚拟主机如:local.com

 

 

3、修改虚拟主机 None改为All

 

原因:

 

记得apache服务器。

 

 

 

 

3、.htaccess的重写规则语法

下面以一个最基本重写文件.htaccess为例,来学习重写规则的语法:

 

 

 

 

 

语法详细说明:

<IfModule mod_rewrite.c>

</IfModule>

#为了防止没有开启rewrite重写模块而出现的页面报错

Options +FollowSymLinks  允许访问

Options -FollowSymLinks  拒绝访问 403 for-bidden

 

l RewriteEngine On #开启rewrite 引擎

l RewriteCond 条件 #重写条件,相当于控制语句if

 

l RewriteRule 虚拟网址 真实网址 [标志] #重写规则

虚拟网址:一般都是正则表达式写法

真实网址:所访问的服务器真实路径,可以使用$n引用正则表达式中第n各括号中的内容。

注意:如果匹配到了虚拟网址,但是真实网址不存在则会报Internal Server Error的错误

 

 

 

 

 

 

条件可以使用Apache提供的变量

RewriteCond %{REQUEST_FILENAME} !-d

RewriteCond %{REQUEST_FILENAME} !-f

RewriteRule ^(.*)$ index.php/$1 [QSA,L]    相当于隐藏入口文件index.php

 

 

常用的变量:

REQUEST_FILENAME:代表访问的文件

REQUEST_REFERER:访问的来源

其他的可以查看手册:

 

 

-f 表示是一个文件, !-f 不是一个文件,(即请求的文件不存在)

-d 表示是一个目录,!-d 不是一个目录,(即请求的目录不存在)

 

l 常用的标志有:

[F] 禁止访问

[QSA] 自动追加虚拟网址中请求的参数 query string append

[L] last最后一条规则,相当于break,不在往下匹配

[NC] no case 不区分大小写

 

其他选项可查看apache手册:

 

 

 

 

 

4、伪静态的应用场景

4-1、利用重写规则完成普通url重写

 

 

 

 

 

4-2、完成图片防盗链

什么是防盗链?

就是防止别的网站引用你的网站的图片、视频或css,js等一类的静态文件,会给你的服务器带来http请求,也就增加了服务器的压力。

 

解决防盗链办法:

第一种:给图片加上水印,添加自己公司的logo,相当于给自己做宣传。

第二种:判断请求的来源,利用重写规则来实现。

 

 

建议使用第一种,直接拒绝,加标志[F],

 

4-3404 错误处理页面设置

在重写文件.htaccess中加以下内容:

errorDocument  404  /404.html

 

 

效果:

 

 

 

 

 

 

三、使用ob缓存实现真静态

上面的都是讲关于页面的伪静态,实质上都是访问动态的url,最终还是要经过服务器和数据库的处理,想实现页面的真静态化可以通过phpob缓存来实现:

1ob缓存认识

Ob就是output_buffering:输出缓存。

 

如果ob(函数ob_start())缓存打开,则echo的数据首先放在ob缓存,php代码执行完毕后,会把ob缓存的数据移到程序缓存,然后依次返回给浏览器缓存

 

也就是在请求一个php的过程中,实际经过了三个缓存:

ob缓存(如果开启)—> 程序缓存—> 浏览器缓存。

 

注意:请求一个php一定要经过的两个缓存:程序缓存和浏览器缓存。

 

 

2ob缓存重要的几个函数

ob_start() 开启ob缓存

ob_get_contents() 获取ob缓存中的数据

ob_clean() 清空ob缓存中的内容

ob_end_clean() 清空ob缓存中的内容并关闭ob缓存

ob_flush() ob缓存中的数据刷新(移到)到程序缓存

 

3、ob缓存函数的使用

代码一:

 

 

 

代码二:

 

 

 

 

 

 

 

4、案例-使用ob缓存文章详情页

 

准备数据

 

 

文章列表页

 

 

显示数据:

 

 

 

缓存文章详情内容

 

生成静态页如下:

detail.php?id=3   detail_3.html

detail.php?id=4   detail_4.html

......

detail.php?id=n   detail_n.html

 

 

生成如下所示的静态页:

 

 

 

既然生成对应文章的静态页,应该直接读取静态页即可,读取静态页但是需要考虑两点:

① 判断对应的静态页是否存在

人为设置一个有效期,静态页在有效期内才读取静态页。因为用户可能对数据库中的文章进行编辑或者删除,这时候不能够读取静态页,而且编辑文章的时候还要生成最新的文章静态页

 

有效期怎么设置?

文件的最后修改时间+有效期 > time()

100+50>151

 

 

 

 

 

完整代码:

 

 

 

如果用户有编辑或删除数据,需要根据文章的id使用php提供unlink(文件名)函数把对应文章静态页要删除。

 

比如并发量1000,缓存60s,  60s内,访问文章详情页操作数据库 1次,减轻数据库的压力

比如并发量1000,不缓存,60s, 访问文章详情页操作数据数据库 60*1000 = 60000

posted @ 2017-08-27 08:46  奋斗的黑蜗牛1号  阅读(402)  评论(0编辑  收藏  举报