一、buffer认知
buffer:PHP存在的缓冲区,一个内存地址空间,主要用于存储数据区域
可在php.ini中打开参数
output_buffering = on
或者在PHP文件中手动开启
ob_start 打开输出控制缓冲
ob_get_contents 返回输出缓冲区内容
ob_clean 清空输出缓冲区,清空后不会在终端显示
ob_get_clean 得到当前缓冲区的内容并删除当前缓冲区内容,清空后不会在终端显示
二、实现静态化方式
1、file_put_contents(“静态页面文件名”,需要存储的数据)
2、使用PHP内置缓存机制实现页面静态化
ob_start() –>
require(“文件”) /模板文件 –>
if(file_get_contents(“文件名”, ob_get_contents()){}else{}
ob_end_flush();
3、fopen->fwrite->fclose
三、触发系统生成静态化页面的方式
1、页面添加缓存时间
2、手动触发方式
3、crontab定时扫描程序(Linux)
四、实例
1、页面添加缓存时间
<?php
$gid = $_GET['gid'];//商品id
$goods_statics_file = "goods_file_".$gid.".html";//对应静态页文件
$expr = 3600*24*5//静态文件有效期5天
if(file_exists($goods_statics_file)){
$file_mtime =filemtime($goods_statics_file);//文件修改时间
if(time() - $file_mtime < $expr){//如果没过期
echo file_get_contents($goods_statis_file);//输出静态文件内容
exit;
}else{//如果已过期
unlink($goods_statis_file);//删除过期的静态页文件
ob_start();
//从数据库读取数据,并赋值给相关变量
//include ("xxx.html");//加载对应的商品详情页模板
$content = ob_get_contents();//把详情页内容赋值给$content变量
file_put_contents($goods_statis_file,$content);//写入内容到对应静态文件中
ob_end_flush();//输出商品详情页信息
}
}else{
ob_start();
//从数据库读取数据,并赋值给相关变量
//include ("xxx.html");//加载对应的商品详情页模板
$content = ob_get_contents();//把详情页内容赋值给$content变量
file_put_contents($goods_statis_file,$content);//写入内容到对应静态文件中
ob_end_flush();//输出商品详情页信息
}
?>
五、局部动态化实现
ajax
六、伪静态
1、通过正则表达式处理
http://index.com/newlist.php?type=2&catogory_id=1
/newlist.php/2/1.html
备注:Nginx服务器不支持pathinfo模式
preg_match(‘/^\/(\d+)\/(\d+).html/’, $_SERVER[‘PATH_INFO’], $match);
$type = $match[1];
$category_id = $match[2];
2、web服务器rewrite配置
Apache下rewrite配置:
(1) 虚拟域名配置
httpd.conf文件中开启相关模式
LoadModule rewrite_module modules/mod_rewrite.so
Include conf/extra/httpd-vhosts.conf(Apache默认是Include conf/vhosts.conf)
找到hosts文件配置域名
(2) httpd_vhosts.conf配置文件相关信息
在.htaccess中加入
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /index.php [L,E=PATH_INFO:$1]
</IfModule>
将http://jeecn.com/path?key=value 转换为: http://jeecn.com/path/key/value
RewriteCond %{QUERY_STRING} ^(\w+)=(\w+)$
RewriteRule ^/path /path/%1/%2?
RewriteRule重写规范flag说明
[R=301] 强制外部重定向 301永久重定向 302临时重定向 默认302
[C] 链接下一条规则,如果这一条不匹配,下一条就不进入
[L] 结束规则,立即停止重写操作,并不再应用其他重写规则
[NE] 不对URL中的特殊字符进行hexcode转码
[NC] 不区分大小写
[QSA] 用于在URL中截取查询字符串
[G] Apache服务器返回410
[F] (force URL to be forbidden)禁用URL,返回403HTTP状态码。
[N](next round) 重新从第一条规则开始运行重写过程。
[T]=MIME-type(force MIME type) 强制MIME类型
[NS] (used only if no internal sub-request) 只用于不是内部子请求
[PT](pass through to next handler) 传递给下一个处理
例如:
RewriteRule ^/abc(.*) /def$1 [PT] # 将会交给/def规则处理
Alias /def /ghi
[S]=num(skip next rule(s)) 跳过num条规则
[E]=VAR:VAL(set environment variable) 设置环境变量
RewriteBase URL-path 设置了目录级重写的基准URL
RewriteCond 指定定义了一个规则的条件,即在RewriteRule前加一个条件
1、TestString 使用说明 1−9 1-9 引用紧跟在RewriteCond后面的RewriteRule中模板中匹配的数据
2、TestString 使用说明 %{NAME_OF_VARIABLE} 服务器变量引用
3、TestString 使用说明 %1-9
%1-9 RewriteCond条件中最后符合的条件中的分组成分
4、CondPattern 使用说明
-d 是否是目录 -f 是否是文件
5、[flags]使用说明
[NC] 不区分大小写
[OR] 或语法,如果不加,默认为and
RewriteMap
MapName 命名给RewriteRule调用
MapType 文件类型有txt、rnd
MapSource map文件路径
基于重定向的文件访问控制
防盗链:
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !www.example.com [NC]
RewriteRule \.(gif|jpg|png)$ [F,NC]
限制IP
RewriteMap hosts-deny(拒绝的地址)
RewriteCond ${hosts-deny:%{REMOE_ADDR} | NOTFOUND} deny [OR]
RewriteCond ${hosts-deny:%{REMOTE_HOST} | NOTFOUND} deny
RewriteRule ^ - [F]
限制迅雷
先通过代码分析出迅雷特征
RewriteCond %{HTTP_USER_AGENT} 2.0.50727 [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^BlackWido [NC,OR]
RewriteRule . abuse.txt
然后奖abuse.txt文件放到主目录下
thinkPHP配置URL
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]