首先,应该明确动态页面与静态页面之间的区别,为什么静态页面的加载要比动态的快。
PHP文件的执行阶段是:语法分析——>编译——>运行。
动态是执行这整个过程。
静态(只是一个纯静态的 html 文件),跳过了分析和编译的步骤,直接运行。
(优化页面响应时间的常见四种方法:动态页面静态化,优化数据库,使用负载均衡,使用缓存。。)
静态化用于那些不需要经常变动的页面,生成一个静态页面供用户访问,以减少服务器脚本的响应、计算时间。
PHP静态化-->伪静态:可以通过设置apache服务器得到,用户访问的网址是静态页面,实际上经过apache转换,实际上访问的是动态页面。
-->纯静态:html文件
-->局部纯静态:部分内容是动态的,通过ajax和JS技术辅助实现
-->全部纯静态
我们创建了一个文件,在文件里写东西,并不是直接写入(缓冲区已经开启的情况下),而是先写入到buffer中,buffer满了,或者我们主动将buffer中数据冲刷才写入到磁盘中的文件。生成静态文件的原理就是,文件a.php的echo的同时,把要输出的内容全部存进buffer中,再将buffer中统一存入一个新的静态文件a.html中(a.html实际上一开始是空的),下次如果再次访问a.php,如果a.html存在且没有过期,就直接将用户的访问导向a.html,跳过了更多的语法分析和编译。
(1)a.php获取数据库内容
(2)a.php 中,require_once(‘a.tpl‘)。.tpl由于是html文件,也会输出到终端。
(3)将数据填充到a.tpl中
(4)file_put_contents()将缓冲填充到a.shtml静态文件中,终端输出生成静态文件成功的提示。
实际中,用户是不关心a.php的,他们只访问a.shtml
buffer在php.ini文件中应该是默认开启的。"output-buffering = On"。若没有开启,可以在a.php有输出之前,ob_start()开启buffer。
ob_start()//开启缓冲区,若原先已默认开启,则相当于开启新的
ob_get_contents()//得到缓冲区内容
file_put_contents()//将指定内容放入指定路径的文件
ob_clean()//清空缓冲区,这个方法之前echo的东西就不会输出到终端。
ob_get_clean()//得到并删除缓冲区内容
根据业务需求,触发系统生成静态文件的三种方式:
(1)页面添加缓存时间:
用户访问a.php,但在其开始加上判断,是否已经存在静态文件且未过期。是,则引入;否,则,生成新的内容,输出并生成静态文件,以供下回访问使用。
if(is_file(a.shtml) && (time() - filemtime(‘./a.shtml‘)) < 300){
require_once(‘./a.shtml‘);
}else{
//获取新的内容,输出,并生成新的静态文件
}
(2)手动触发方式:
比方说,工程师临时修改了页面中某一个东西。只要在后台制作一个集合了可以更新的文件的表单,想要更新哪个点哪个。
(3)crontab定时扫描程序。linux中定时执行文件。tail -f /var/log可以查看crontab日志。