1、原生页面静态化
1.1 页面静态化基本知识
什么是页面静态化?
就是把网页做成 静态的网页(html网页)
首先了解下
文件缓存和
页面静态化区别
文件缓存
页面静态化
为什么要使用页面静态化?
减轻数据库、服务器的压力,让用户的访问速度更快
哪些情况适合使用页面静态化?
频繁的读取数据的网站:新浪、知乎等内容展示类网站
读取的速度会提高
哪些情况不适合使用页面静态化?
数据会频繁变化的一些网站:股票、天气预报、会员数量等
如何实现页面静态化?
(1)ob缓冲
(2)file_put_contents()
1.2 ob缓冲介绍
ob缓冲:
output buffering 输出缓冲,用来避免多个用户访问服务器时,一次性将数据输出,服务器压力比较大
开启ob缓冲
在php的配置文件中,找到
output_buffering
开启,重启服务器
1.3 ob缓冲相关函数
ob_start()
开辟一块新的缓冲区域
ob_get_contents()
获取缓冲区域里面的内容
ob_get_length()
获取缓冲区域内容的长度
ob_flush()
将缓冲区域的内容直接刷出\输出
ob_get_flush()
获得缓冲区域刷出的内容
ob_clean()
清楚缓冲区
ob_get_clean()
清除缓冲区前获取缓冲区内容
1.4 ob缓冲处理器
当服务器向客户端回应、输出数据时(将缓冲区域的数据输出到客户端的时候),自动触发的一个函数,就称之为
缓冲处理器
通常会使用ob_gzhandler
处理器对输出的内容进行压缩处理
使用方式
// 开启缓冲区,并压缩
ob_start('ob_gzhandler');
1.5 ob多缓冲
多次调用
ob_start()
,每次调用ob_start()
,都会开启一个新的缓冲区,域,如果我们操作缓冲区域(例如:清空),操作的就是离ob_start()
最近的那个区域
结果
1.6 ob缓冲实现页面静态化
// 1.开启缓冲区
ob_start();
// 2. 缓冲区内容
require 'info.php';
// 3. 读取缓冲区内容
$contents = ob_get_contents(); //不用加参数
// 4. 写入静态文件
$path = 'ob.html'; // 定义将要成为的静态页面文件
file_put_contents($path, $contents);
// 5. 原来要读的 info.php 文件静态化成为 ob.html
2、伪静态
伪静态:
顾名思义就是假的静态网站,也就是说动态网站为了方便被搜索引擎收录,利用服务器的rewirte
实现的假静态的过程。
例如:www.odshen.com/blog/user/id/2/page/5...
// 动态
伪静态就是www.odshen.com/blog/user.html
// 看似静态
封装的方法
//根据url地址栏上面的信息,计算出、分析出MCA分别是什么
public function initPathInfo()
{
# 主要获取url上面地址,然后进行处理
if(isset($_SERVER['PATH_INFO'])){
$basic_path = $_SERVER['PATH_INFO']; // /admin/question/index/page/3.html
//1. 将路径信息中后缀为.html的这个障眼法,去掉
$path = strrchr($basic_path, '.'); //.html
$path = str_replace($path, '', $basic_path);
$path = substr($path, 1); //如果不写第三个参数就表示截取到末尾
$arr = explode('/', $path);
//统计数组的元素个数
$length = count($arr);
if($length==1){
//只有模块,$_GET['m'],至于c、a会自动找配置文件
$_GET['m'] = $arr[0];
}elseif ($length==2){
//确定模块、控制器,方法会找配置文件
$_GET['m'] = $arr[0];
$_GET['c'] = $arr[1];
}elseif($length==3){
$_GET['m'] = $arr[0];
$_GET['c'] = $arr[1];
$_GET['a'] = $arr[2];
}else{
//大于3个参数的时候:admin/question/index/page/3/id/15
$_GET['m'] = $arr[0];
$_GET['c'] = $arr[1];
$_GET['a'] = $arr[2];
//$_GET['page'] = 3;
for($i=3;$i<$length;$i+=2){
$_GET[$arr[$i]] = $arr[$i+1];
}
}
}
}
补充:有入口文件可以隐藏(例如index.php)