在大型网站中,例如首页面,新闻页面等一些经常访问,但数据却基本不变的页面大部分都是.html页面(静态页面),静态页面相对于动态页面,不仅能使网页的浏览速度提升N多倍,而且利于网站的seo。
对于用户较多的网站,缓存生成的静态页面有时候会减少百万次千万次的数据库访问,浏览速度的提升效果立竿见影。
php中的out_put buffering,简称ob技术,是一个生成静态页面比较简单的方法。
里面主要的函数有:
ob_start(); // 开启输出缓存;
ob_get_contents(); //得到ob中的缓存内容
ob_clean(); //清空ob中的内容,不关闭ob缓存;
ob_end_clean(); //清空ob中的内容,并关闭ob缓存;
ob_flush(); //将ob中的内容'移动'到程序缓存,不关闭ob缓存;
ob_end_flush(); //将ob中的内容移动到程序缓存,并关闭ob缓存;
举例:
此时浏览器输出123,a.html中的内容为123
<?php
ob_start();
echo 1;
echo 2;
ob_flush();
echo 4;
$content = ob_get_contents();
file_put_contents('a.html',$content);
?>
此时浏览器输出124,a.html中的内容为4 //ob_flush()将ob中的内容移动到程序缓存,而ob并未关闭,所以a.html中的内容为4
假设php开启了ob,则其先将输出显示的数据缓存到ob中,当程序执行结束或者ob_flush()后,ob中的内容会'移动'到程序缓存,最后程序缓存反馈给浏览器进行显示
也就是ob---->程序缓存------>浏览器,但如果ob中途被关闭的话,输出的数据则会直接缓存到程序缓存中。
至于flush();它区别于ob_flush();它是将程序缓存中的数据强制'移动'到浏览器。
比如这段代码:
<?php
for($i = 0 ;$i< 5;$i++){
echo $i;
flush();
sleep(1);
}
?>
我们期待的是浏览器在第一秒显示0,第二秒显示01,第三秒显示012,第四秒显示0123,第五秒显示01234,
但是 php手册中有这一段话:一些版本的 Microsoft Internet Explorer 只有当接受到的256个字节以后才开始显示该页面,所以必须发送一些额外的空格来让这些浏览器显示页面内容。
所以讲上述 代码添加一行:echo str_repeat(" ",1024);// 重复输出1024个空格
<?php
echo str_repeat(" ",1024);
for($i = 0 ;$i< 5;$i++){
echo $i;
flush();
sleep(1);
}
?>
此时即可达到要求
我们产生静态页面时,步骤:
ob_start();
输出内容
输出内容
输出内容
$content = ob_get_contents();
ob_end_clean();
file_put_contents('xxx.html',$content);
即生成了xxx.html静态页面。
再次浏览时可先判断该文件是否存在,如果存在就进行跳转或者直接输出页面即可。。
至于ob实现的页面静态化的弊端,首先就是他的实时性比较差,其次,若生成了过多的静态页面,则会对服务器的硬盘带来压力而且不利于静态页面的搜索。最好是将静态页面按年月日进行文件夹的归类,这样能够更快的查找到所需的静态页面。