您的位置:首页 > 编程语言 > PHP开发

PHP实现页面静态化

2017-07-25 16:15 375 查看
一、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'];/
4000
/商品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状态码。

(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−91-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]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  php