Linux gzip压缩输出

1、gzip介绍javascript

         gzip是GNU zip的缩写,它是一个GNU自由软件的文件压缩程序,也常常用来表示gzip这种文件格式。软件的做者是Jean-loup Gailly和Mark Adler。1992年10月31日第一次公开发布,版本号是0.1,目前的稳定版本是1.2.4。php

        Gzip主要用于Unix系统的文件压缩。咱们在Linux中常常会用到后缀为.gz的文件,它们就是GZIP格式的。现今已经成为Internet 上使用很是广泛的一种数据压缩格式,或者说一种文件格式。 当应用Gzip压缩到一个纯文本文件时,效果是很是明显的,通过GZIP压缩后页面大小能够变为原来的40%甚至更小,这取决于文件中的内容。css

 

  HTTP协议上的GZIP编码是一种用来改进WEB应用程序性能的技术。web开发中能够经过gzip压缩页面来下降网站的流量,而gzip并不会对cpu形成大量的占用,略微上升,也是几个百分点而已,可是对于页面却能压缩30%以上,很是划算。html

      利用Apache中的Gzip模块,咱们可使用Gzip压缩算法来对Apache服务器发布的网页内容进行压缩后再传输到客户端浏览器。这样通过压缩后实际上下降了网络传输的字节数(节约传输的网络I/o),最明显的好处就是能够加快网页加载的速度。java

      网页加载速度加快的好处不言而喻,除了节省流量,改善用户的浏览体验外,另外一个潜在的好处是Gzip与搜索引擎的抓取工具备着更好的关系。例如 Google就能够经过直接读取gzip文件来比普通手工抓取更快地检索网页。在Google网站管理员工具(Google Webmaster Tools)中你能够看到,sitemap.xml.gz 是直接做为Sitemap被提交的。web

      而这些好处并不只仅限于静态内容,PHP动态页面和其余动态生成的内容都可以经过使用Apache压缩模块压缩,加上其余的性能调整机制和相应的服务器端缓存规则,这能够大大提升网站的性能。所以,对于部署在Linux服务器上的PHP程序,在服务器支持的状况下,咱们建议你开启使用Gzip Web压缩。算法

2、Web服务器处理HTTP压缩的过程以下:

    1. Web服务器接收到浏览器的HTTP请求后,检查浏览器是否支持HTTP压缩(Accept-Encoding 信息);apache

    2. 若是浏览器支持HTTP压缩,Web服务器检查请求文件的后缀名;浏览器

    3. 若是请求文件是HTML、CSS等静态文件,Web服务器到压缩缓冲目录中检查是否已经存在请求文件的最新压缩文件;缓存

    4. 若是请求文件的压缩文件不存在,Web服务器向浏览器返回未压缩的请求文件,并在压缩缓冲目录中存放请求文件的压缩文件;

    5. 若是请求文件的最新压缩文件已经存在,则直接返回请求文件的压缩文件;

    6. 若是请求文件是动态文件,Web服务器动态压缩内容并返回浏览器,压缩内容不存放到压缩缓存目录中。

下面是两个演示图:

                                       未使用Gzip:

 

                                      

                                  开启使用Gzip后:

                                 

 

 

3、启用apache的gzip功能

 

      Apache上利用Gzip压缩算法进行压缩的模块有两种:mod_gzip 和mod_deflate。要使用Gzip Web压缩,请首先肯定你的服务器开启了对这两个组件之一的支持。

      虽然使用Gzip同时也须要客户端浏览器的支持,不过不用担忧,目前大部分浏览器都已经支持Gzip了,如IE、Mozilla Firefox、Opera、Chrome等。

     经过查看HTTP头,咱们能够快速判断使用的客户端浏览器是否支持接受gzip压缩。若发送的HTTP头中出现如下信息,则代表你的浏览器支持接受相应的gzip压缩:

[cpp]  view plain copy print ?
 
  1. Accept-Encoding: gzip 支持mod_gzip  
  2. Accept-Encoding: deflate 支持mod_deflate   
  3.   
  4. Accept-Encoding: gzip,deflate 同时支持mod_gzip 和mod_deflate  

如firebug查看:

Accept-Encoding: gzip,deflate 是同时支持mod_gzip 和mod_deflate

 

   若是服务器开启了对Gzip组件的支持,那么咱们就能够在http.conf或.htaccess里面进行定制,下面是一个.htaccess配置的简单实例:

mod_gzip 的配置:

[cpp]  view plain copy print ?
 
  1. # mod_gzip:  
  2. <ifModule mod_gzip.c>  
  3. mod_gzip_on Yes  
  4. mod_gzip_dechunk Yes  
  5. mod_gzip_item_include file \.(html?|txt|css|js|php|pl)$  
  6. mod_gzip_item_include handler ^cgi-script$  
  7. mod_gzip_item_include mime ^text/.*  
  8. mod_gzip_item_include mime ^application/x-javascript.*  
  9. mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.*  
  10. <ifModule>  

mod_deflate的配置实例:

 

打开打开apache 配置文件httpd.conf 

将#LoadModule deflate_module modules/mod_deflate.so去除开头的#号

[cpp]  view plain copy print ?
 
  1. # mod_deflate:  
  2. <ifmodule mod_deflate.c>  
  3. DeflateCompressionLevel 6 #压缩率, 6是建议值.  
  4. AddOutputFilterByType DEFLATE text/plain  
  5. AddOutputFilterByType DEFLATE text/html  
  6. AddOutputFilterByType DEFLATE text/xml  
  7. AddOutputFilterByType DEFLATE text/css  
  8. AddOutputFilterByType DEFLATE text/javascript  
  9. AddOutputFilterByType DEFLATE application/xhtml+xml  
  10. AddOutputFilterByType DEFLATE application/xml  
  11. AddOutputFilterByType DEFLATE application/rss+xml  
  12. AddOutputFilterByType DEFLATE application/atom_xml  
  13. AddOutputFilterByType DEFLATE application/x-javascript  
  14. AddOutputFilterByType DEFLATE application/x-httpd-php  
  15. AddOutputFilterByType DEFLATE image/svg+xml  
  16. </ifmodule>  

里面的文件MIME类型能够根据本身状况添加,至于PDF 、图片、音乐文档之类的这些自己都已经高度压缩格式,重复压缩的做用不大,反而可能会由于增长CPU的处理时间及浏览器的渲染问题而下降性能。因此就不必再经过Gzip压缩。经过以上设置后再查看返回的HTTP头,出现如下信息则代表返回的数据已通过压缩。即网站程序所配置的Gzip压缩已生效。

[cpp]  view plain copy print ?
 
  1. Content-Encoding: gzip  

firebug查看:

 

 

注意:

1)无论使用mod_gzip 仍是mod_deflate,此处返回的信息都同样。由于它们都是实现的gzip压缩方式。

2)CompressionLevel 9是指压缩程度的等级(设置压缩比率),取值范围在从1到9,9是最高等级。据了解,这样作最高能够减小8成大小的传输量(看档案内容而定),最少也可以节省一半。 CompressionLevel 预设能够采用 6 这个数值,以维持耗用处理器效能与网页压缩质量的平衡. 不建议设置过高,若是设置很高,虽然有很高的压缩率,可是占用更多的CPU资源.
3) 对已是压缩过的图片格式如jpg,音乐档案如mp三、压缩文件如zip之类的,就不必再压缩了。

 

4、mod_gzip 和mod_deflate的主要区别是什么?使用哪一个更好呢?

       第一个区别是安装它们的Apache Web服务器版本的差别:

       Apache 1.x系列没有内建网页压缩技术,因此才去用额外的第三方mod_gzip 模块来执行压缩。而Apache 2.x官方在开发的时候,就把网页压缩考虑进去,内建了mod_deflate 这个模块,用以取代mod_gzip。虽然二者都是使用的Gzip压缩算法,它们的运做原理是相似的。

       第二个区别是压缩质量:

       mod_deflate 压缩速度略快而mod_gzip 的压缩比略高。通常默认状况下,mod_gzip 会比mod_deflate 多出4%~6%的压缩量。

       那么,为何使用mod_deflate?

       第三个区别是对服务器资源的占用:

       通常来讲mod_gzip 对服务器CPU的占用要高一些。mod_deflate 是专门为确保服务器的性能而使用的一个压缩模块,mod_deflate 须要较少的资源来压缩文件。这意味着在高流量的服务器,使用mod_deflate 可能会比mod_gzip 加载速度更快。

      不太明白?简而言之,若是你的网站,天天不到1000独立访客,想要加快网页的加载速度,就使用mod_gzip。虽然会额外耗费一些服务器资源, 但也是值得的。若是你的网站天天超过1000独立访客,而且使用的是共享的虚拟主机,所分配系统资源有限的话,使用mod_deflate 将会是更好的选择。

     另外,从Apache 2.0.45开始,mod_deflate 可以使用DeflateCompressionLevel 指令来设置压缩级别。该指令的值可为1(压缩速度最快,最低的压缩质量)至9(最慢的压缩速度,压缩率最高)之间的整数,其默认值为6(压缩速度和压缩质 量较为平衡的值)。这个简单的变化更是使得mod_deflate 能够轻松媲美mod_gzip 的压缩。

P.S. 对于没有启用以上两种Gzip模块的虚拟空间,还能够退而求其次使用php的zlib函数库(一样须要查看服务器是否支持)来压缩文件,只是这种方法使用起来比较麻烦,并且通常会比较耗费服务器资源,请根据状况慎重使用。

 

 

5、zlib.output_compression和ob_gzhandler编码方式压缩

      服务器不支持mod_gzip、mod_deflate模块,若想经过GZIP压缩网页内容,能够考虑两种方式,开启zlib.output_compression或者经过ob_gzhandler编码的方式

      1)zlib.output_compression是在对网页内容压缩的同时发送数据至客户端。

       2)ob_gzhandler是等待网页内容压缩完毕后才进行发送,相比之下前者效率更高,但须要注意的是,二者不能同时使用,只能选其一,不然将出现错误。

       二者的实现方式作简单描述:

    1. zlib.output_compression实现方式

       在默认状况下,zlib.output_compression是关闭:

 

[cpp]  view plain copy print ?
 
  1. ; Transparent output compression using the zlib library  
  2. ; Valid values for this option are 'off', 'on', or a specific buffer size  
  3. ; to be used for compression (default is 4KB)  
  4. ; Note: Resulting chunk size may vary due to nature of compression. PHP  
  5. ;   outputs chunks that are few hundreds bytes each as a result of  
  6. ;   compression. If you prefer a larger chunk size for better  
  7. ;   performance, enable output_buffering in addition.  
  8. ; Note: You need to use zlib.output_handler instead of the standard  
  9. ;   output_handler, or otherwise the output will be corrupted.  
  10. ; http://php.net/zlib.output-compression  
  11. zlib.output_compression = Off  
  12.   
  13. ; http://php.net/zlib.output-compression-level  
  14. ;zlib.output_compression_level = -1  

 

        如需开启需编辑php.ini文件,加入如下内容:

[cpp]  view plain copy print ?
 
  1. zlib.output_compression = On  
  2. zlib.output_compression_level = 6  

       能够经过phpinfo()函数检测结果。

        当zlib.output_compression的Local Value和MasterValue的值同为On时,表示已经生效,这时候访问的PHP页面(包括伪静态页面)已经GZIP压缩了,经过Firebug或者在线网页GZIP压缩检测工具可检测到压缩的效果。

      2. ob_gzhandler的实现方式

      若是须要使用ob_gzhandler,则需关闭zlib.output_compression,把php.ini文件内容更改成:

[cpp]  view plain copy print ?
 
  1. zlib.output_compression = Off  
  2. zlib.output_compression_level = -1  


经过在PHP文件中插入相关代码实现GZIP压缩P压缩:

 

[cpp]  view plain copy print ?
 
  1. if (extension_loaded('zlib')) {  
  2.     if (  !headers_sent() AND isset($_SERVER['HTTP_ACCEPT_ENCODING']) &&  
  3.           strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== FALSE)  
  4.     //页面没有输出且浏览器能够接受GZIP的页面  
  5.     {  
  6.         ob_start('ob_gzhandler');  
  7.     }  
  8. }  
  9. //待压缩的内容  
  10. echo $context;  
  11. ob_end_flush();  

 

 

  如何浏览器提示:内容编码错误,应该是:

 使用ob_start('ob_gzhandler')时候前面已经有内容输出,检查前面内容以及require include调用文件的内容。若没法找到能够在调用其它文件前使用ob_start(),调用以后使用 ob_end_clean () 来清除输出的内容:

 

[php]  view plain copy print ?
 
  1. if (extension_loaded('zlib')) {  
  2.     if (  !headers_sent() AND isset($_SERVER['HTTP_ACCEPT_ENCODING']) &&  
  3.     strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== FALSE)  
  4.         //页面没有输出且浏览器能够接受GZIP的页面  
  5.     {  
  6.         ob_end_clean ();  
  7.         ob_start('ob_gzhandler');  
  8.     }  
  9. }  

或者咱们使用gzencode来压缩:

 

 

[php]  view plain copy print ?
 
  1. <?php  
  2. $encoding = 'gzip';  
  3. $content = '123456789';  
  4. ob_end_clean ();  
  5. header('Content-Encoding: '.$encoding);  
  6. $result = gzencode($content);  
  7. echo $result;  
  8. exit;  

 

 

不论是zlib.output_compression仍是ob_gzhandler,都仅能对PHP文件进行GZIP压缩,对于HTML、CSS、JS等静态文件只能经过调用PHP的方式实现。

最后想说的是,如今主流的浏览器默认使用的是HTTP1.1协议,基本都支持GZIP压缩,对于IE而言,假如你没有选中其菜单栏工具-》Internet 选项-》高级-》HTTP 1.1 设置-》使用 HTTP 1.1,那么,你将感觉不到网页压缩后的速度提高所带来的快感!

相关文章
相关标签/搜索