页面静态化
一、真静态和伪静态
1、概念
PHP静态化分为:真静态化和伪静态化。真静态化又分为:局部静态化(ajax)和完全静态化(html)。
真静态化:是指由动态语言如php、java等生成的动态页面保存为静态的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文件)的优缺点:
优点:①速度快,因为加载的时候不需要调用数据库,响应速度快。
②安全性高,从安全的角度讲,静态网页不易遭受黑客的攻击。
③有利于seo(seo优化),有利于搜索引擎收录。(网址越短,越容易被搜索引擎搜录)
缺点:大量的生成静态文件占用磁盘空间,对磁盘的响应速度(i/o)有影响。(redis,nginx,memcahe)
伪静态(假的html)的优缺点:
优点:①易于被搜索引擎收录。
②缩短了url的长度,隐藏了文件的实际路径提高了安全性,也易于记忆和输入。
③占用空间小,不想真静态那样占用磁盘空间
缺点:最大的缺点就是会占用一定量的cpu占有率,降低服务器响应的时间(主要是磁盘i/o影响)。
问:在什么情况下不要使用真静态?
答:①页面的数据更新比较频繁,最好不要使用真静态(如股票、基金等实时报价系统)
②会生成海量页面(如大型论坛等网站),降低服务器响应的时间(主要是磁盘i/o影响)
③查询该页面一次后,以后再也不查询该页面
④不愿意被搜索引擎抓取的页面
⑤访问量小的页面
使用真静态也需要看网站并发量,一般是针对于某个网页转化为真静态。真静态只是其中一种解决办法,后面还有一些其他的技术(redis,memcache,mysql读写分离)也可以解决网站并发量大的问题
二、伪静态的实现
1、需求
在实际的项目开发中,如果我们的页面不适合使用真静态技术,但是又希望页面安全性高和同时利于seo,这种情况下我们可以考虑使用伪静态的技术。
使用技术:利用Apache服务器的rewrite重写机制实现
2、开启apache的伪静态配置
1、修改apache的httpd.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-3、404 错误处理页面设置
在重写文件.htaccess中加以下内容:
errorDocument 404 /404.html
效果:
三、使用ob缓存实现真静态
上面的都是讲关于页面的伪静态,实质上都是访问动态的url,最终还是要经过服务器和数据库的处理,想实现页面的真静态化可以通过php的ob缓存来实现:
1、ob缓存认识
Ob就是output_buffering:输出缓存。
如果ob(函数ob_start())缓存打开,则echo的数据首先放在ob缓存中,当php代码执行完毕后,会把ob缓存的数据移到程序缓存,然后依次返回给浏览器缓存
也就是在请求一个php的过程中,实际经过了三个缓存:
ob缓存(如果开启)—> 程序缓存—> 浏览器缓存。
注意:请求一个php一定要经过的两个缓存:程序缓存和浏览器缓存。
2、ob缓存重要的几个函数
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次