Thinkphp压缩html代码并生成“真正”静态缓存(1)

摘要: 首先想这个标题就杀死了不少脑细胞。为什么要压缩html代码,为什么要生成静态缓存?生成静态缓存好理解,减少服务器压力,减少数据库读取消耗等等最终目的就是为了提高网页加载速度从而使用户用的舒服。

Thinkphp压缩html代码并生成“真正”静态缓存(1)

首先想这个标题就杀死了不少脑细胞。为什么要压缩html代码,为什么要生成静态缓存?生成静态缓存好理解,减少服务器压力,减少数据库读取消耗等等最终目的就是为了提高网页加载速度从而使用户用的舒服。但压缩html代码又是为了什么,不是有gzip吗?我想来想去,就是一个——自己看着舒服!

一、压缩html的方法

网上有不少,收集整理了一下:核心代码如下

$chunks = preg_split( '/(<pre.*?\/pre>)/ms', $content, -1, PREG_SPLIT_DELIM_CAPTURE );
foreach ( $chunks as $c )
        {
            if ( strpos( $c, '<pre' ) !== 0)
            {
              $IE='<!--[if';
              $IE1='<!-【';
              $start='<!--';
              $end='-->';
              $start1='<!--@';
              $end1='@-->';

              $c = preg_replace('#\/\*.*\*\/#isU','',$c);//js块注释
              $c = preg_replace('#[^:"\']\/\/[^\n]*#','',$c);//js行注释
              $c = str_replace("\t","",$c);//tab
              $c = preg_replace('#\s?(=|>=|\?|:|==|\+|\|\||\+=|>|<|\/|\-|,|\()\s?#','$1',$c);//字符前后多余空格
              $c = preg_replace( '#([^"\'])[\s]+#', '$1 ', $c );
              $c = preg_replace( '#>\s<#', '><', $c );
              $c = str_replace("\t","",$c);//tab
              $c = str_replace("\r\n","",$c);//回车
              $c = str_replace("\r","",$c);//换行
              $c = str_replace("\n","",$c);//换行

              //去除html注释,忽略IE兼容
              $c=str_replace($IE,$IE1,$c);
              $c=str_replace($start,$start1,$c);
              $c=str_replace($end,$end1,$c);
              $c = preg_replace( '#(<![\-]{2}@[^@]*@[\-]{2}>)#', '', $c );
              $c=str_replace($IE1,$IE,$c);
              $c=str_replace($end1,$end,$c);
              $c = trim($c," ");
            }
            $content .= $c;
        }
  1. 出去html注释语句时,忽略兼容IE的判断语句如<!--[if lt IE 10]><![endif]-->
  2. 忽略pre标签

看下效果图:
html压缩效果图


当然,每次访问都用这个压缩下的话,服务器肯定吃不消,这就必不可少用到静态缓存。

2、生成静态缓存

您可能注意到文章标题中的”真正”两字,可能用得不是很准确,那么仅用这个说明这个和静态缓存直接的差别:

在开启html静态缓存后,按照thinkphp3.2的完全开发手册系统流程(一共68个步骤)中所说,第一次执行会在第61步默认调用系统的WriteHtmlCache行为写入静态缓存(HTML_CACHE_ON参数开启),之后如果在有效期内会在第46步默认调用系统的ReadHtmlCache行为读取静态缓存(HTML_CACHE_ON参数开启)并直接输出(echo Storage::read(HTML_FILE_NAME,'html');)。当然这确实节约不少资源,开启静态缓存后,系统流程第47-68都可以减少执行,当然这可能是最耗费系统资源的地方(因为应用中操作数据库的流程都在这个范围内)。但流程中的其它步骤1-45步骤呢? 当然这些步骤正式部署后可以通过自动生成应用编译缓存文件减少一些。有没有通过设置,使生成的静态缓存像静态html一样让服务器直接输出呢。
我想这是可以的,当然也是有不少限制:

  • 必须开启伪静态
  • 伪静态的目录名为静态缓存的存储路径
  • 静态缓存的文件名必须和url中的伪静态文件名一直
  • 不能通过有效期控制文件的更新

这个对哪些发布之后几乎不会有修改的文章而言是比较用作用的。主要是通过控制THINKPHP行为扩展,在保存缓存之前压缩代码,保存之后就是压缩之后的代码。

本博客就是实现了压缩+”真正”静态缓存,效果如下:
url路径


缓存文件


3、thinkphp行为扩展

thinkphp的行为扩展就不多说了,直接见thinkphp3.2开发手册行为扩展,系统本身默认有几个标签位,生成静态缓存的行为标签位是view_filter(视图输出过滤标签位),可以在tags.php 中自定义扩展行为,但压缩行为必须在写入缓存之前。

这就是《Thinkphp压缩html代码并生成“真正”静态缓存》所需要的基本信息,下次的《Thinkphp压缩html代码并生成“真正”静态缓存(2)》就具体给出实现方法。

猜你喜欢

微信QQ空间QQ好友新浪微博联系客服