页面静态化
简介
页面静态化,就是生成静态的html页面,为什么要生成静态化的html页面?当我们点击一个问题,进入到问题详情页面的时候:
在问题详情页面需要连接上述4张表,才能把所有需要显示的内容都显示出来每次连接4张表来查询,效率是非常低的,所以我们使用页面静态化实现:
- 如何实现:将来发布问题、回复问题之后,先查询该问题相关的信息,并生成一个纯静态的html页面,这样其他用户请求的时候,不需要再次连接数据库
- 应用场景
数据不是频繁改变的,都可以使用页面静态化实现:
知乎的问题列表、新浪新闻页面等,就可以生成静态化的html页面,让用户访问,但是有一些项目:股票、天气预报、价格等实时变化的数据,不适合使用页面静态化
页面静态化与缓存的区别
- 缓存分析
上面的流程代码节省了数据库的压力,但是php的压力依然存在,PHP里面要实例化smarty、判断是否有缓存、读取缓存等
- 画图分析页面静态化的流程:
那么如何生成静态的html页面呢?通过ob缓冲技术
来实现的
ob缓冲介绍
开启ob缓冲
默认ob缓冲器开启的,为了保险起见,我们检查一下:
ob缓冲相关函数
ob_start():开启缓冲区域,每ob_start()一次,就会在PHP服务器端开启一块缓冲区域,开启之后,服务器向客户端响应的内容就会优先输出到缓冲区域
ob_clean():清除缓冲区域
ob_get_contents():获得缓冲区域的内容
ob_get_length():获得缓冲区域内容长度
ob_flush():刷出,将缓冲区域的内容直接输出
ob_get_flush():获得刷出的内容,并没有直接输出,而是保存起来
ob_clean():清除缓冲区域的内容
ob_get_clean():先获得缓冲区域的内容,然后再清空缓冲区域
ob_end_flush():先刷出缓冲区域的内容,再关闭缓冲
ob_end_clean():先清空缓冲区域的内容,在关闭
ob缓冲处理器
简介
ob缓冲处理器: 指的是当我们将缓冲区域的内容输出到客户端的时候,使用的处理器对数据进行处理,通常我们会使用ob_gzhandler处理器对输出的内容进行压缩处理
演示一个没有使用ob缓冲处理器处理的效果
在演示一下使用ob_gzhandler处理对输出的数据进行压缩处理之后的效果
ob多缓冲
简介
我们可以多次调用ob_start(),每次调用ob_start()都会重新开启一块缓冲区域
这就称之为多缓冲
而且我们对缓冲区域的操作,操作的是离我们开启的缓冲最近的那一个区域
举例演示:
ob缓冲实现页面静态化
只需要将goods_template.html
执行的结果(上图所示),保存到一个静态的html(goods_list.html
)文件中
代码实现
1.<?php
2.require_once 'DAOPDO.class.php';
3.$option = array(
4. 'host' => '127.0.0.1',
5. 'dbname' => 'php_9',
6. 'user' => 'root',
7. 'pwd' => 'root',
8. 'port' => 3306,
9. 'charset' => 'utf8'
10.);
11.
12.$dao = DAOPDO::getSingleton($option);
13.
14.$sql = "SELECT * FROM tn_goods";
15.$goods = $dao -> fetchAll($sql);
16.
17.//1. 先开启缓冲,后面的所有输出都会先输出到缓冲里面
18.ob_start();
19.require_once 'goods_template.html';
20.//2. 获取缓冲区域里面的内容
21.$result = ob_get_contents();
22.ob_end_clean();
23.
24.//3. 写入到静态的html文件中
25.if(file_put_contents('goods_list.html',$result)){
26. echo '页面静态化生成成功';
27.}