一、页面静态化的必要性
随着网站的内容的增多和用户访问量的增多,无可避免的是网站加载会越来越慢,受限于带宽和服务器同一时间的请求次数的限制,我们往往需要在此时对我们的网站进行代码优化和服务器配置的优化。一般情况下会从以下方面来做优化:动态页面静态化、优化数据库、使用负载均衡、使用缓存、使用CDN加速。
现在很多网站在建设的时候都要进行静态化的处理,为什么网站要进行静态化处理呢?我们都知道纯静态网站是所有的网页都是独立的一个html页面,当我们访问的时候不需要经过数据的处理直接就能读取到文件,访问速度就可想而知了,而其对于搜索引擎而言也是非常友好的一个方式。
纯静态网站在网站中是怎么实现的?
纯静态的制作技术是需要先把网站的页面总结出来,分为多少个样式,然后把这些页面做成模板,生成的时候需要先读取源文件然后生成独立的以.html结尾的页面文件,所以说纯静态网站需要更大的空间,不过其实需要的空间也不会大多少的,尤其是对于中小型企业网站来说,从技术上来讲,大型网站想要全站实现纯静态化是比较困难的,生成的时间也太过于长了。不过中小型网站还是做成纯静态的比较,这样做的优点是很多的。
而动态网站又是怎么进行静态处理的?
页面静态化是指将动态页面变成html/htm静态页面。动态页面一般由asp,php,jsp,.net等程序语言编写而成,非常便于管理。但是访问网页时还需要程序先处理一遍,所以导致访问速度相对较慢。而静态页面访问速度快,却又不便于管理。那么动态页面静态化即可以将两种页面的好处集中到一起。
静态处理后又给网站带来了哪些好处?
(1)静态页面相对于动态页面更容易被搜索引擎收录。访问静态页面不需要经过程序处理,因此可以提高运行速度。减轻服务器负担。HTML页面不会受Asp相关漏洞的影响。
(2)静态处理后的网站相对没有静态化处理的网站来讲还比较有安全性,因为静态网站是不会是黑客攻击的首选对象,因为黑客在不知道你后台系统的情况下,黑 客从前台的静态页面很难进行攻击。同时还具有一定的稳定性,比如数据库或者网站的程序出了问题,他不会干扰到静态处理后的页面,不会因为程序或数据影响而打不开页面。
(3)搜索引擎蜘蛛程序更喜欢这样的网址,也可以减轻蜘蛛程序的工作负担,虽然有的人会认为现在搜索引擎完全有能力去抓取和识别动态的网址,在这里还是建议大家能做成静态的尽量做成静态网址。
什么是HTML静态化?
常说的页面静态化分为两种,一种是伪静态,即url 重写,一种是真静态化。
在PHP网站开发中为了网站推广和SEO等需要,需要对网站进行全站或局部静态化处理,PHP生成静态HTML页面有多种方法,比如利用PHP模板、缓存等实现页面静态化。
PHP静态化的简单理解就是使网站生成页面以静态HTML的形式展现在访客面前,PHP静态化分纯静态化和伪静态化,两者的区别在于PHP生成静态页面的处理机制不同。
PHP伪静态:利用Apache mod_rewrite实现URL重写的方法。
HTML静态化的好处:
(1)减轻服务器负担,浏览网页无需调用系统数据库。
(2)有利于搜索引擎优化SEO,Baidu、Google都会优先收录静态页面,不仅被收录的快还收录的全;
(3)加快页面打开速度,静态页面无需连接数据库打开速度较动态页面有明显提高;
(4)网站更安全,HTML页面不会受php程序相关漏洞的影响;观看一下大一点的网站基本全是静态页面,而且可以减少攻击,防sql注入。数据库出错时,不影响网站正常访问。
(5)数据库出错时,不影响网站的正常访问。
(6)最主要是可以增加访问速度,减轻服务器负担,当数据量有几万,几十万或是更多的时候你知道哪个更快了. 而且还容易被搜索引擎找到。生成html文章虽操作上麻烦些,程序上繁杂些,但为了更利于搜索,为了速度更快些,更安全,这些牺牲还是值得的。
我们可以通过典型的压力测试工具来测试访问效果相同的页面用php和用html的差异性。
使用PHP开发常用的,就是Apache自带的 ab.exe(apache benchmark,基准测试,压力测试。)程序。
这个工具在mysql的bin目录下。
实例:典型的测试,测试在某种并发的情况下完成某些请求所消耗的时间及其他信息:
ab.exe –c 100 –n 5000 URL (同一时刻100个并发量,总共要完成5000个请求)
测试结果如下
完成进度:
响应概要信息:
基准测试结果:
整体统计信息
平均到每个请求的时间消耗:
响应时间的分区统计:
测试静态的和动态的执行差异
静态:
动态:
从以上测试可知,访问效果相同的页面用html比用php快得多。因此很有必要对网页静态化。
二、实现页面静态化核心技术-使用OB缓冲
实现页面静态化需要的核心技术是OB,output_buffering,输出缓冲。如果开启了缓冲,就不会直接输出到浏览器,而是存储到缓冲里。就像水库一样,把闸关了,水就不会流出去了,默认闸是开的,水直接往下流。缓冲的作用是存储PHP所生成的响应主体内容。缓冲原理如下图:
解释:php解析器解析完php程序会生成html代码,默认生成的代码会直接输出到浏览器。如果开启了缓冲,那么php解析器解析完php程序后生成的html代码就会存储到缓冲区里,而不直接输出到浏览器里,但是,如果在脚本周期结束时还没有关闭缓冲,缓冲区的内容就还会输出到浏览器。缓冲的原理和水库一样,把水库的闸关了,水就会存储起来而不会流出去,默认闸是开的,水直接往下流。开闸时,水就往下流。
操作缓冲需要先开启缓冲,然后处理被缓存的内容,最后关闭缓冲。使用php的核心函数,具体方法如下:
//开启缓冲(相当于使用水库并关闸)
ob_start(); //开启缓冲区
//获取缓冲区的内容(相当于抽取水库的水然后存到指定容器里)
ob_get_contents(); //获取缓冲区的内容
ob_get_clean(); //获取缓冲区的内容并清空缓冲
ob_get_flush(); //获取缓冲区的内容并刷新缓冲
//清空缓冲(相当于瞬间将水库的水蒸发完)
ob_clean(); //清空缓冲
ob_get_clean(); //获取缓冲区的内容并清空缓冲
ob_end_clean(); //关闭缓冲区时清空缓冲
//刷新缓冲(相当于水库开闸放水,通过“刷新”(放水)使得水库的水一直是活水).
flush(); //把不在缓冲中的或者说是被释放出来的数据发送到浏览器
ob_flush(); //立刻输出内部缓冲区的内容,但不关闭缓冲区
ob_get_flush(); //获取内容时刷新缓冲
ob_end_flush(); //关闭缓冲时刷新缓冲
Tip: 在脚本周期结束时,刷新操作会自动执行。
//关闭缓冲(相当于不使用水库)
ob_end_flush(); //立刻输出缓冲区的内容且关闭缓冲
ob_end_clean(); //清空缓冲且关闭缓冲
以上函数其实就是几个单词的组合,start开启,end关闭,get获取,clean清空,flush刷新。
实例1:使用PHP文件读写功能生成静态页面
<?
$out1 = "<html><head><title>PHP网站静态化教程</title></head><body>欢迎访问PHP网站开发教程网www.leapsoul.cn,本文主要介绍PHP网站页面静态化的方法</body></html>";
$fp = fopen("leapsoulcn.html","w");
if(!$fp)
{
echo "System Error";
exit();
}
else
{
fwrite($fp,$out1);
fclose($fp);
echo "Success";
}
?>
实例2:使用缓冲+文件读写实现静态化
<?
ob_start();
echo "<html>".
"<head>".
"<title>PHP网站静态化教程</title>".
"</head>".
"<body>欢迎访问PHP网站开发教程网www.leapsoul.cn,本文主要介绍PHP网站页面静态化的方法</body>".
"</html>";
$out1 = ob_get_contents();
ob_end_clean();
$fp = fopen("leapsoulcn.html","w");
if(!$fp)
{
echo "System Error";
exit();
}
else
{
fwrite($fp,$out1);
fclose($fp);
echo "Success";
}
?>
实例3:使用nosql从内存中读取内容(其实这个已经不算静态化了而是缓存),以memcache为例:
<?php
$gid = $_GET['gid']+0;//商品id
$goods_statis_content = "goods_content_".$gid;//对应键
$expr = 3600*24*10;//有效期,十天
$mem = new Memcache;
$mem--->connect('memcache_host', 11211);
$mem_goods_content = $mem->get($goods_statis_content);
if($mem_goods_content){
echo $mem_goods_content;
}else{
ob_start();
//从数据库读取数据,并赋值给相关变量
//include ("xxx.html");//加载对应的商品详情页模板
$content = ob_get_contents();//把详情页内容赋值给$content变量
$mem->add($goods_statis_content,$content, false, $expr);
ob_end_flush();//输出商品详情页信息
}
?>
我们可以写一个函数来封装静态化的操作,以便日后调用。
/**
* createhtml() 生成静态html文件
* @param string $sourceUrl 源文件
* @param string $targetUrl 目标文件
* @return void
*/
function createhtml($sourceUrl,$targetUrl){
ob_start();
$content=file_get_contents($sourceUrl);
$fp=fopen($targetUrl,"w") or die("打开文件".$targetUrl."失败");
fwrite($fp, $content);
ob_end_clean();
fclose($fp);
}
三、 扩展问题
静态页面中动态(即时)数据问题。通过Ajax可以解决。
静态化内容,一旦改动,都需要重新生成静态页面。
整站静态化,内容聚合页和内容详细页。其中详细页适合做静态化。
管理大量静态文件。简单的分子目录存储。甚至分硬盘,分文件服务器存储。