Linux gzip压缩输出

一、gzip介绍

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

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

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

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

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

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

二、Web服务器处理HTTP压缩的过程如下:

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

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

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

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

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

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

下面是两个演示图:

                                       未使用Gzip:

 

                                  开启使用Gzip后:

三、启用apache的gzip功能

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

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

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

[cpp] view plaincopyprint?

  1. Accept-Encoding: gzip 支持mod_gzip
  2. Accept-Encoding: deflate 支持mod_deflate
  3. 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 plaincopyprint?

  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 plaincopyprint?

  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 plaincopyprint?

  1. Content-Encoding: gzip

firebug查看:

注意:

1)不管使用mod_gzip 还是mod_deflate,此处返回的信息都一样。因为它们都是实现的gzip压缩方式。

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

四、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函数库(同样需要查看服务器是否支持)来压缩文件,只是这种方法使用起来比较麻烦,而且一般会比较耗费服务器资源,请根据情况慎重使用。

 

五、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 plaincopyprint?

  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. ; http://php.net/zlib.output-compression-level
  13. ;zlib.output_compression_level = -1

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

[cpp] view plaincopyprint?

  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 plaincopyprint?

  1. zlib.output_compression = Off
  2. zlib.output_compression_level = -1

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

[cpp] view plaincopyprint?

  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 plaincopyprint?

  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 plaincopyprint?

  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,那么,你将感受不到网页压缩后的速度提升所带来的快感!

时间: 2024-08-07 08:37:39

Linux gzip压缩输出的相关文章

[转]PHP通过zlib扩展实现GZIP压缩输出

1. GZIP介绍 GZIP是GNU zip的缩写,它是一个GNU自由软件的文件压缩程序,也经常用来表示gzip这种文件格式.GZIP主要用于Unix系统的文件压缩,我们经常看到的后缀为.gz的文件,它们就是GZIP格式的.GZIP的压缩效果比较明显,应用Gzip压缩网页时,网页可以压缩30%甚至更多. HTTP协议上的GZIP编码是一种用来改进WEB:应用程序性能的技术,Web开发中通过GZIP压缩页面来降低网站的流量,而且GZIP不会占用很多CPU.总体来考虑,启用GZIP还是非常划算的.通

PHP中zlib扩展实现GZIP压缩输出各种方法总结

一般情况下我们出现大量数据传输理希望减少服务器的带宽压力,会采取一种方式来压缩文件传输,php中用zlib也可以实现gzip压缩输出,下面我们来看GZIP压缩输出各种方法总结. GZIP(GNU-ZIP)是一种压缩技术.经过GZIP压缩后页面大小可以变为原来的30%甚至更小.这样用户浏览的时候就会感觉很爽很愉快! 准备工作 1.找不到php_zlib.dll文件? 自php4.3开始zlib压缩就已经内置在php中了,所以至少Windows环境下是不需要安装zlib的. 2.安装搭建php运行环

linux gzip(压缩文件或者目录)

减少文件大小有两个明显的好处,一是可以减少存储空间,二是通过网络传输文件时,可以减少传输的时间.gzip是在Linux系统中经常使用的一个对文件进行压缩和解压缩的命令,既方便又好用.gzip不仅可以用来压缩大的.较少使用的文件以节省磁盘空间,还可以和tar命令一起构成Linux操作系统中比较流行的压缩文件格式.据统计,gzip命令对文本文件有60%-70%的压缩率. 1.命令格式: gzip[参数][文件或者目录] 2.命令功能: gzip是个使用广泛的压缩程序,文件经它压缩过后,其名称后面会多

apache php gzip压缩输出的实现方法

一.gzip介绍 gzip是GNU zip的缩写,它是一个GNU自由软件的文件压缩程序,也经常用来表示gzip这种文件格式.软件的作者是Jean-loup Gailly和Mark Adler.1992年10月31日第一次公开发布,版本号是0.1,目前的稳定版本是1.2.4. Gzip主要用于Unix系统的文件压缩.我们在Linux中经常会用到后缀为.gz的文件,它们就是GZIP格式的.现今已经成为Internet 上使用非常普遍的一种数据压缩格式,或者说一种文件格式. 当应用Gzip压缩到一个纯

Apache启用GZIP压缩网页传输方法

一.gzip介绍 Gzip是一种流行的文件压缩算法,如今的应用十分广泛,尤其是在Linux平台.当应用Gzip压缩到一个纯文本文件时,效果是很明显的,大约能够降低70%以上的文件大小.这取决于文件里的内容. 利用Apache中的Gzip模块,我们能够使用Gzip压缩算法来对Apacheserver公布的网页内容进行压缩后再传输到client浏览器.这样经过压缩后实际上降低了网络传输的字节数,最明显的优点就是能够加快网页载入的速度. 网页载入速度加快的优点不言而喻,除了节省流量,改善用户的浏览体验

Nginx压缩输出配置

随着网站内容不断增加,我们的网站上的内容和功能也变得丰富多彩,这时就会有一个问题出现----我们的网站加载会明显变慢,这对于网站的访客来说可不是一件愉快的事,那么我们该如何优化网站,加快网站的访问速度呢?减少网站的文件内容是不可能了,但我们可以用一种"魔法"把这些文件变小,下面我们便来认识一下这个奇妙的缩小术-----gzip. gzip(GNU-ZIP)是一种压缩技术,经过它的压缩,页面大小会缩小到一种可观的比例,它的原理就是在服务器端进行压缩,当压缩后的数据包到达用户端的浏览器时,

Linux常见压缩命令 - gzip,zcat,bzip2,bzcat

几个常见的压缩文件扩展名 *.Z compress 程序压缩的文件. *.gz gzip 程序压缩的文件. *.bz2 bzip2 程序压缩的文件: *.tar tar 程序打包的数据,并没有压缩过: *.tar.gz tar 程序打包的文件,当中而且经过 gzip 的压缩 *.tar.bz2 tar 程序打包的文件.当中而且经过 bzip2 的压缩 compress [[email protected] ~]# yum install ncompress base 100% |========

linux PHP空间设置GZIP压缩网页方法!

网站设置GZIP压缩,缩小网页体积,让网站访问速度更快!方法很简单,只需要在你的网站根目录建立.htaccess文件并输入以下代码: 新建-记事本-复制以下代码:(如果网站已有.htaccess文件,直接在末尾加上下面代码)保存. # GZIP BEGIN <IfModule mod_expires.c> ExpiresActive On ExpiresByType image/gif A2592000 ExpiresByType image/jpeg A2592000 ExpiresByTy

在windows、linux中开启nginx的Gzip压缩大大提高页面、图片加载速度

为了降低tomcat服务的压力,把页面上的图片采用windows版的nginx进行加载,由于有些图片比较大,加载特别的慢,所以在nginx中打开了gzip的压缩功能.加载图片的速度快了很多. 通过站长工具中的"网页GZIP压缩检测"工具检测图片的压缩率达到了69.53%,如下图: 下面介绍nginx.conf文件是怎么配置的: 1.打开nginx.conf配置文件: 2.找到#gzip on这句,如下图: 3.在把#gzip on 改成下面代码: #开启Gzip gzip on; #不