页面纯静态

一、静态化理解

1、静态化: PHP静态化的简单理解就是使网站生成页面以静态HTML的形式展现在访客面前。静态化是解决减轻网站压力,提高网站访问速度的常用方案。常说的页面静态化分为两种,一种是伪静态,即url 重写,一种是纯(真)静态化,两者的区别在于PHP生成静态页面的处理机制不同。我们以纯(真)静态化为主来讲讲
2、纯静态:PHP静态化的简单理解就是使网站生成页面以静态HTML的形式展现在访客面前,将PHP程序生成静态的HTML文件,保存到服务器的磁盘中
3、原理:在用户访问PHP程序时,首先检测静态的HTML文件是否存在,如果存在直接输出静态文件,如果静态文件不存在,查询数据库,生成静态文件,   并输出 。

4、优缺点:html静态页(真静态)的好处有三点;一是减少服务器对数据响应的负荷,二是加载不用调动数据库,响应速度快。三是便于优化引擎。
缺点也有三点:一是维护不方便,每次都要手动生成。三是空间占用比较大。三是生成的文件多了,服务器对html文件的响应负担也较重。

二、为什么要让网页静态化?(使用静态化的意义)

1、加快页面打开浏览速度,静态页面无需连接数据库打开速度较动态页面有明显提高;
2、有利于搜索引擎优化SEO,Baidu、Google都会优先收录静态页面,不仅被收录的快还收录的全;
3、减轻服务器负担,浏览网页无需调用系统数据库;
4、网站更安全,HTML页面不会受php相关漏洞的影响; 观看一下大一点的网站基本全是静态页面,而且可以减少攻击,防sql注入。
5、数据库出错时,不影响网站正常访问。
      生成html文章虽操作上麻烦些,程序上繁杂些,但为了更利于搜索,为了速度更快些,更安全,这些牺牲还是值得的。 
 说法一:  
1、省掉了服务器处理时间和调用数据库的时间访问速度比一般动态网站快10-20倍;
2、不用调用数据库服务器端的CPU调用大大减少增加服务器的性能;
3、 生成静态路径利用搜索引擎的抓取和收录;
4、在排名中静态页面的排名权重要高于动态路径的页面    
说法二: 
1、安全,静态页面从理论上讲是没有攻击漏洞的;
2、没有数据库访问或减少服务器对数据响应的负荷,速度快;
3、化化引擎,易于搜索引擎收录,搜索引擎比较喜欢收录静态页面;
4、降低服务器的承受能力,因为其不需要解析就可以返回客户端,因此减少了服务器的工作量,同时也减少了数据库的成本;
5、有意义的文件名,提高了可用性(对中文似乎就没这个优势了吧) 。 
说法三:
提问:ASP生成静态HTML后更有利于搜索引擎收录吗?为什么?
答:是的,静态HTML更有利于搜索引擎收录。因为静态网页和动态网页的区别在于动态网页可以给于浏览者权限,而搜索引擎抓取的时候是以游客身份进入  的,所以不容易被抓取和收录,而静态网页由于不存在页面权限问题,所以更容易被收录,相对来说如果你的动态页面没有加任何权限的话也同样容易备收 录! 不生成静态页面的博客ASP PHP .net CGI的论坛只要没有访问权限限制都会被收录! 

三、ob系列函数中常用函数

ob_start();                //打开一个输出缓冲区,所有的输出信息不再直接发送到浏览器,而是保存在输出缓冲区里面。
ob_clean();               //删除内部缓冲区的内容,不关闭缓冲区(不输出)。 
ob_end_clean();        //删除内部缓冲区的内容,关闭缓冲区(不输出)。 
ob_get_clean();        //返回内部缓冲区的内容,关闭缓冲区。相当于执行 ob_get_contents() and
ob_end_clean() ob_flush();              
//发送内部缓冲区的内容到浏览器,删除缓冲区的内容,不关闭缓冲区。 ob_end_flush();       
//发送内部缓冲区的内容到浏览器,删除缓冲区的内容,关闭缓冲区。 ob_get_flush();        
//返回内部缓冲区的内容,并关闭缓冲区,再释放缓冲区的内容。相当于ob_end_flush()并返回缓冲区内容。 flush();     
               //将ob_flush释放出来的内容,以及不在 PHP缓冲区中的内容,全部输出至浏览器;刷新内部缓冲区的内容,并输出。 ob_get_contents();   
//返回缓冲区的内容,不输出。 ob_get_length();       
//返回内部缓冲区的长度,如果缓冲区未被激活,该函数返回FALSE。 ob_get_level();          //Return
the nesting level of the output buffering mechanism.
ob_get_status();       //Get status of output buffers. 
ob_implicit_flush();  
//打开或关闭绝对刷新,默认为关闭,打开后ob_implicit_flush(true),所谓绝对刷新,即当有输出语句(e.g:
echo)被执行时,便把输出直接发送到浏览器,而不再需要调用flush()或等到脚本结束时才输出。 
ob_gzhandler               //ob_start回调函数,用gzip压缩缓冲区的内容。
ob_list_handlers           //List all output handlers in use
output_add_rewrite_var     //Add URL rewriter values
output_reset_rewrite_vars  //Reset URL rewriter values 
这些函数的行为受php_ini设置的影响: output_buffering      
//该值为ON时,将在所有脚本中使用输出控制;若该值为一个数字,则代表缓冲区的最大字节限制,当缓存内容达到该上限时将会自动向浏览器输出当前的缓冲区里的内容。
output_handler         //该选项可将脚本所有的输出,重定向到一个函数。例如,将 output_handler 设置为
mb_output_handler() 时,字符的编码将被修改为指定的编码。设置的任何处理函数,将自动的处理输出缓冲。
implicit_flush         //作用同ob_implicit_flush,默认为Off。

四 1、举例

使用PHP文件读写功能与ob缓存机制生成静态页面。 
比如某个商品的动态详情页地址是: http://xxx.com?goods.php?gid=112
那么这里我们根据这个地址读取一次这个详情页的内容,然后保存为静态页,下次有人访问这个商品详情页动态地址时,我们可以
直接把已生成好的对应静态内容文件输出出来。

 1 <?php
 2 Header("content-type:text/html;charset=UTF-8");
 3 $gid = $_GET['goods_id']+0;//商品id
 4 $goods_statis_file = "goods_file_".$gid.".html";//对应静态页文件
 5 $expr = 10;//静态文件有效期,秒
 6 if(file_exists($goods_statis_file)){
 7   $file_ctime = filectime($goods_statis_file);//文件创建时间
 8   if($file_ctime+$expr > time()){//如果没过期
 9     echo file_get_contents($goods_statis_file);//输出静态文件内容
10     exit;
11   }else{//如果已过期
12     unlink($goods_statis_file);//删除过期的静态页文件
13     ob_start();
14     //从数据库读取数据,并赋值给相关变量
15     //include ("xxx.html");//加载对应的商品详情页模板
16    echo date('Y-m-d H:i:s', time());
17     $content = ob_get_contents();//把详情页内容赋值给$content变量
18     file_put_contents($goods_statis_file,$content);//写入内容到对应静态文件中
19     ob_end_flush();//输出商品详情页信息
20   }
21 }else{
22  $dsn = "mysql:host=127.0.0.1;dbname=rbac";
23  $db = new PDO($dsn, 'root', '',  array(PDO::ATTR_PERSISTENT =>true));
24  $db->query(" set names utf8 ");
25  set_time_limit(0);
26  $sql = "SELECT * FROM `user` ; ";
27  $data = $db->query($sql)->fetchAll(PDO::FETCH_ASSOC);
28   ob_start();
29   print_r($data);
30   //从数据库读取数据,并赋值给相关变量
31   
32   //include ("xxx.html");//加载对应的商品详情页模板
33   
34   $content = ob_get_contents();//把详情页内容赋值给$content变量
35   file_put_contents($goods_statis_file, $content);//写入内容到对应静态文件中
36   ob_end_flush();//发送内部缓冲区的内容到浏览器,删除缓冲区的内容,关闭缓冲区。
37 }
38 ?> 
原文地址:https://www.cnblogs.com/BrokenHeart/p/10615940.html