页面静态化
对内容不经常变化的面向用户的页面进行静态化处理可以显著提升页面的响应速度,同时还可以减少对服务器系统资源的占用并降低数据库服务器的压力。 网站静态化,看产品或者网站的需求,不要为了静态化而静态化
一、为什么要静态化
- 加快页面打开浏览速度,静态页面只占用硬盘。无需连数据库和编译
- 有利于搜索引擎优化SEO。百度、谷歌都会优先收录静态页面,收录的又快有全
- 网站更安全。减少PHP漏洞或程序bug影响。减少攻击
不足的地方:
- 信息不能实时更新同步
- 页面不断增加,会占用大量的磁盘空间
二、静态化方案
局部静态化:是生成的静态文件中,有局部的数据还是通过ajax技术动态获取的; 完全静态化:即不存在动态获取数据的情况,所以内容都来自静态的html页面
伪静态:不是真正请求静态页面
大型动态网站静态化
大型网站(高访问量,高并发量),如果是静态网站,可以扩展足够多的web服务器,然后支持超大规模的并发访问。 静态化方案:
- JS、css,Image等资源,服务端合并再返回
- CDN内容分发网络技术【网络传输的效率跟距离长短有关系的原理,通过算法,计算最近的静态服务器节点】
- web服务器动静结合。网站不经常变的内容做成静态化,或放入缓存内
三、利用ob缓存实现页面静态化
为什么要有缓冲区
简单来说,高速的cpu早早处理完自己的数据,想通过线路传递给用户,但是线路太窄了,一下输送不过去。如果引入缓冲区,cpu可以将生成的数据放入缓冲区,然后自己哪儿凉快儿哪儿呆着这歇着去了。缓冲区根据指令适时将数据输出。这样就合理解决了高速cpu与低速I/O设备的矛盾了
ob缓存的作用
- 页面静态化
- header头前有输出的问题
解决Warning: Cannot modify header information - headers already sent by的错误!
究其发生错误的原因:是因为响应头和相应主体位置错位导致的!正常情况下,服务器返回给浏览器的相应内容,应该是:响应头+响应主体!
但是,如果我们开启了ob缓存,那么相应头信息(一般也就是header()函数进行设置的信息),会被放入到程序缓存中!
而其他的输出内容,如:echo print_r var_dump 等,都会先被放入ob缓存中!
等程序结束的时候,或者ob缓存关闭的实话,将ob缓存的内容在放入程序缓存中!从而保证响应头信息,始终在响应主体内容之前!
输出缓冲控制函数
在php5.3以后ob缓存默认是开启的
butter其实就是缓冲区,一个内存地址空间,主要用于存储数据区域
ob_get_contents 获取PHP缓冲区内容
ob_clean 清空缓冲区
ob_get_clean 得到当前缓存区的内容并删除当前输出缓冲区
ob_flush() 把ob缓存中的内容刷新到程序缓存区。
flush() 把程序缓存区的内容强制刷新到浏览器中。
ob_end_clean();清空缓存内容并关闭缓存区,ob_get_contents取不到内容
纯静态化的实现
<?php ob_start();//开启缓存 ?> <p>我是要生成的静态内容,也可以在该处链接数据库生成动态内容于此</p> <?php //把生成的静态内容保存到index.html文件,而不是输出到浏览器 file_put_contents( 'index.html', ob_get_clean() ); ?>
触发系统生成纯静态化页面
- 请求页面时判断页面缓存是否存在,如果存在是否过期。
- 如果页面缓存存在并且没有过期则直接将缓存内容返回给浏览器。
- 如果页面缓存不存在或者已经过期,则进行正常的数据库查询及页面渲染,同时将页面缓存起来
<?php $file_name = 'index.html'; $lifttime = 10; if(file_exists( $file_name ) && filemtime( $file_name ) - time() < $lifttime ){ require_once( $file_name );//引入文件 }else{ ob_start( ); ?> <p>我是要生成的静态内容</p> <?php //输出到浏览器 file_put_contents( $file_name, ob_get_contents()); }
四、php.ini 中的相关配置项
output_buffering
默认为 off , 当设置为 on 时,则在所有脚本自动打开输出缓冲区,也就相当于在每个脚本都自动执行了 ob_start() 这个函数,而不用再显示的调用该函数。其也可以设置为一个整型的数字,代表缓冲区可以存储的最大字节数output_handler
默认为 null , 其值只能设置为一个内置的函数名,作用就是将脚本的所有输出,用所定义的函数进行处理。implicit_flush
默认为 off , 当设置为 on 时,PHP将在输出后,自动送出缓冲区内容。