`
wbj0110
  • 浏览: 1610206 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

使用Gzip压缩网页

阅读更多

gzipGNU zip的缩写,它是一个GNU自由软件的文件压缩程序,也经常用来表示gzip这种文件格式。

HTTP/1.1协议允许客户端可以选择要求从服务器下载压缩内容,这个标准本身定义了两种压缩方法:“gzip”(内容用gzip数据流进行封装)以及“deflate”(内容是原始格式、没有数据头的DEFLATE数据流)。许多HTTP客户端库以及绝大多数当今的浏览器都支持这两种格式。在用户浏览器发送请求的HTTP头中,  带有“Accept-Encoding: gzip, deflate”参数则表明支持gzip和deflate两种压缩算法。

gzip命令的常用选项

-c,–stdout 将解压缩的内容输出到标准输出,原文件保持不变

-d,–decompress 解压缩

-f,–force 强制覆盖旧文件

-l,–list 列出压缩包内储存的原始文件的信息(如,解压后的名字、压缩率等)

-n,–no-name 压缩时不保存原始文件的文件名和时间戳,解压缩时不恢复原始文件的文件名和时间戳(此时,解出来的文件,其文件名为压缩包的文件名)

-N,–name 压缩时保存原始文件的文件名和时间戳,解压缩时恢复原始文件的文件名和时间戳

-q,–quiet 抑制所有警告信息

-r,–recursive 递归

-t,–test 测试压缩文件完整性

-v,–verbose 冗余模式(即显示每一步的执行内容)

-1、-2、…、-9 压缩率依次增大,速度依次减慢,默认为-6

使用Gzip压缩时的一些注意事项:

  1. Gzip不仅可以对HTML、PHP等文件进行压缩,对CSS,JS等文件同样也可以;
  2. Gzip压缩会增加服务器的负载;
  3. 不要使用Gzip对非文本(图片,视频,音频等)文件进行压缩;
  4. 有选择性的使用Gzip压缩(对文本代码较多的页面进行压缩);
  5. 并不是最高的压缩率,压缩的文件就最小;
    高压缩率同时意味着高服务器负载;
    建议把压缩率设为5~8;
  6. IIS,Apache1.3,Apache2.0+启用Gizp,配置方法是不同的;
  7. 未开启Gizp压缩模块的虚拟主机(如Godaddy),只要加载了Zlib库,同样可以实现;

如果你的服务器不支持HTTP压缩,但支持PHP,那么下面的代码就可能对你很有用,下面的代码会自动压缩文件并给浏览器发送缓存设置。

<?php

ob_start();

/*
 * The mkdir function does not support the recursive
 * parameter in the version of PHP run by Yahoo! Web
 * Hosting. This function simulates it.
 */

function mkdir_r( $dir_name, $rights=0777 ) {
   $dirs = explode( "/", $dir_name );
   $dir = "";
   foreach ( $dirs as $part ) {
       $dir .= $part . "/";
       if ( !is_dir( $dir ) && strlen( $dir ) > 0 )
           mkdir( $dir, $rights );
   }
}

/*
 * List of known content types based on file extension.
 * Note: These must be built-in somewhere...
 */

$known_content_types = array(
    "htm"  => "text/html",
    "html" => "text/html",
    "js"   => "text/javascript",
    "css"  => "text/css",
    "xml"  => "text/xml",
    "gif"  => "image/gif",
    "jpg"  => "image/jpeg",
    "jpeg" => "image/jpeg",
    "png"  => "image/png",
    "txt"  => "text/plain"
);

/*
 * Get the path of the target file.
 */

if ( !isset( $_GET["uri"] ) ) {
    header( "HTTP/1.1 400 Bad Request" );
    echo( "<html><body><h1>HTTP 400 - Bad Request</h1></body></html>" );
    exit;
}

/*
 * Verify the existence of the target file.
 * Return HTTP 404 if needed.
 */

if (($src_uri = realpath( $_GET["uri"] )) === false) {
    /* The file does not exist */
    header( "HTTP/1.1 404 Not Found" );
    echo( "<html><body><h1>HTTP 404 - Not Found</h1></body></html>" );
    exit;
}

/*
 * Verify the requested file is under the doc root for security reasons.
 */

$doc_root = realpath( "." );

if (strpos($src_uri, $doc_root) !== 0) {
    header( "HTTP/1.1 403 Forbidden" );
    echo( "<html><body><h1>HTTP 403 - Forbidden</h1></body></html>" );
    exit;
}

/*
 * Set the HTTP response headers that will
 * tell the client to cache the resource.
 */

$file_last_modified = filemtime( $src_uri );
header( "Last-Modified: " . date( "r", $file_last_modified ) );

$max_age = 300 * 24 * 60 * 60; // 300 days

$expires = $file_last_modified + $max_age;
header( "Expires: " . date( "r", $expires ) );

$etag = dechex( $file_last_modified );
header( "ETag: " . $etag );

$cache_control = "must-revalidate, proxy-revalidate, max-age=" . $max_age . ", s-maxage=" . $max_age;
header( "Cache-Control: " . $cache_control );

/*
 * Check if the client should use the cached version.
 * Return HTTP 304 if needed.
 */

if ( function_exists( "http_match_etag" ) && function_exists( "http_match_modified" ) ) {
    if ( http_match_etag( $etag ) || http_match_modified( $file_last_modified ) ) {
        header( "HTTP/1.1 304 Not Modified" );
        exit;
    }
} else {
    error_log( "The HTTP extensions to PHP does not seem to be installed..." );
}

/*
 * Extract the directory, file name and file
 * extension from the "uri" parameter.
 */

$uri_dir = "";
$file_name = "";
$content_type = "";

$uri_parts = explode( "/", $src_uri );

for ( $i=0 ; $i<count( $uri_parts ) - 1 ; $i++ )
    $uri_dir .= $uri_parts[$i] . "/";

$file_name = end( $uri_parts );

$file_parts = explode( ".", $file_name );
if ( count( $file_parts ) > 1 ) {
    $file_extension = end( $file_parts );
    $content_type = $known_content_types[$file_extension];
}

/*
 * Get the target file.
 * If the browser accepts gzip encoding, the target file
 * will be the gzipped version of the requested file.
 */

$dst_uri = $src_uri;

$compress = true;

/*
 * Let's compress only text files...
 */

$compress = $compress && ( strpos( $content_type, "text" ) !== false );

/*
 * Finally, see if the client sent us the correct Accept-encoding: header value...
 */

$compress = $compress && ( strpos( $_SERVER["HTTP_ACCEPT_ENCODING"], "gzip" ) !== false );

if ( $compress ) {
    $gz_uri = "tmp/gzip/" . $src_uri . ".gz";

    if ( file_exists( $gz_uri ) ) {
        $src_last_modified = filemtime( $src_uri );
        $dst_last_modified = filemtime( $gz_uri );
        // The gzip version of the file exists, but it is older
        // than the source file. We need to recreate it...
        if ( $src_last_modified > $dst_last_modified )
            unlink( $gz_uri );
    }

    if ( !file_exists( $gz_uri ) ) {
        if ( !file_exists( "tmp/gzip/" . $uri_dir ) )
            mkdir_r( "tmp/gzip/" . $uri_dir );
        $error = false;
        if ( $fp_out = gzopen( $gz_uri, "wb" ) ) {
            if ( $fp_in = fopen( $src_uri, "rb" ) ) {
                while( !feof( $fp_in ) )
                    gzwrite( $fp_out, fread( $fp_in, 1024*512 ) );
                fclose( $fp_in );
            } else {
                $error = true;
            }
            gzclose( $fp_out );
        } else {
            $error = true;
        }

        if ( !$error ) {
            $dst_uri = $gz_uri;
            header( "Content-Encoding: gzip" );
        }
    } else {
        $dst_uri = $gz_uri;
        header( "Content-Encoding: gzip" );
    }
}

/*
 * Output the target file and set the appropriate HTTP headers.
 */

if ( $content_type )
    header( "Content-Type: " . $content_type );

header( "Content-Length: " . filesize( $dst_uri ) );
readfile( $dst_uri );

ob_end_flush();

?>
分享到:
评论

相关推荐

    使用libcurl获取经过gzip压缩的网页文件

    本文将深入探讨如何使用libcurl获取并解压这些经过gzip压缩的网页文件。 首先,理解libcurl的基本工作原理。libcurl是一个C语言库,提供了一系列函数接口,用于在各种协议下传输数据。对于HTTP协议,libcurl可以...

    最简单的gzip压缩

    在本案例中,我们讨论的是“最简单的gzip压缩”,它是一种广泛使用的压缩格式,尤其在Web服务器上常用于减少HTTP响应大小,提高网页加载速度。 gzip是一种基于DEFLATE算法的压缩格式,它结合了LZ77的无损数据压缩和...

    php读取远程gzip压缩网页的方法

    总的来说,处理远程GZIP压缩网页的关键在于识别HTTP响应中的`Content-Encoding: gzip`头部信息,并根据此信息调整数据获取方法,无论是使用`file_get_contents`的特殊前缀、`cURL`的选项,还是自定义的解压函数。...

    易语言GZIP解压缩

    易语言GZIP解压缩源码,GZIP解压缩,GZIP压缩,GZIP解压,InitDecompression,InitCompression,CreateDecompression,CreateCompression,ResetDecompression,ResetCompression,DestroyDecompression,DeInitCompression,...

    易语言gzip解压缩模块

    易语言gzip解压缩模块源码,gzip解压缩模块,PeLoader_LoadLibrary,PeLoader_FreeLibrary,PeLoader_GetProcAddress,PeLoader_GetEntryPoint,Call,初始化,GZIP压缩,GZIP解压

    IIS网页启用Gzip压缩 提高浏览速度 解决伪静态也可压缩 百度会正常收录

    IIS网页启用Gzip压缩提高浏览速度解决伪静态也可压缩百度会正常收录 IIS网页启用Gzip压缩是提高网页访问速度的重要方法之一。通过启用Gzip压缩,可以减少网页的大小,从而提高浏览速度。但是,很多网站管理员不知道...

    asp.net网站使用GZIP压缩源代码

    本文主要讲述ASP.NET网站开发者,给网站增加GZIP压缩模块,提高网页传输速度,由此增加页面显示速度。 代码采用VS2008开发,使用.net framework2.0,如果你需要用VS2005开发,把文件依次COPY过去即可。 什么是网页...

    gzip压缩js,csss文件

    总结来说,通过gzip压缩js和css文件,可以有效减小文件大小,提高网页加载速度。在Windows环境下,可以利用CMD和gzip命令进行文件压缩,而在服务器端,需要配置相应的设置以支持gzip压缩。理解并掌握这一技巧,对于...

    gzip 压缩 三种方法

    在IT行业中,压缩技术是数据传输和存储时不可或缺的一部分,特别是在网络环境中,为了减少带宽消耗和加快网页加载速度,gzip压缩被广泛使用。本文将详细介绍如何在PHP环境中利用gzip进行数据压缩,涵盖两种服务器端...

    Tomcat下,使用gzip压缩数据

    在IT行业中,优化Web服务性能是一项重要的任务,其中一种常用的方法是通过开启服务器的数据压缩功能...但需要注意,虽然gzip压缩减少了数据传输,但也增加了服务器CPU的使用,因此需要根据实际情况平衡性能与资源消耗。

    Gzip压缩技术以及压缩算法

    Gzip压缩技术是一种广泛应用于互联网的数据压缩方法,其主要目的是减少数据传输量,提高网络传输效率,尤其是在HTTP协议中,Gzip编码能够显著加快网页加载速度。Gzip是由GNU项目中的开发者Jean-loup Gailly和Mark ...

    js压缩gzip格式

    在使用gzip之前,需要确保服务器支持gzip压缩。大多数现代服务器,如Apache和Nginx,都内置了gzip模块。以下是在Apache和Nginx服务器上启用gzip的简单步骤: 1. **Apache配置**: - 打开`httpd.conf`或`.htaccess`...

    Nginx部署使用gzip压缩的Unity网页WebGL

    总结来说,"Nginx部署使用gzip压缩的Unity网页WebGL"涉及到的步骤包括Nginx服务器的配置、gzip压缩的启用、Unity的WebGL导出、反向代理的设置以及安全性和性能优化。理解并熟练掌握这些知识点对于高效地发布和运行...

    IIS启用GZIP压缩js、css无效的原因及解决方法.docx

    在IT开发领域,提高网站性能是至关重要的,其中一种常用的方法是启用服务器的GZIP压缩,以减小网页传输的数据量,加快页面加载速度。本文主要探讨的是在IIS服务器上启用GZIP压缩针对JavaScript(js)和CSS文件无效的...

    EhCache开启gzip压缩功能

    在Web应用中,开启gzip压缩功能能够显著减小数据传输量,从而加快网页加载速度,降低服务器带宽消耗。以下是对EhCache开启gzip压缩功能的详细说明。 首先,gzip是一种广泛使用的数据压缩算法,尤其在Web服务器中,...

    WebLogic的GZip压缩

    WebLogic的GZip压缩是一种优化技术,用于减少通过网络传输的数据量,特别是在Web应用程序中,可以显著提升网页加载速度和服务器性能。GZip压缩利用了HTTP协议中的Content-Encoding头,服务器在发送响应到客户端...

    php gzip 压缩js或css

    `Gzip`是一种广泛使用的数据压缩算法,通过在服务器端压缩文件后再传输到浏览器,可以显著减少网络带宽的使用,加快网页加载速度。 首先,我们需要理解`Gzip`的工作原理。`Gzip`基于`DEFLATE`算法,它结合了LZ77...

    易语言源码易语言GZIP解压缩源码.rar

    GZIP压缩算法基于DEFLATE,结合了LZ77的无损数据压缩算法和霍夫曼编码,能够在保持数据完整性的同时,有效降低文件大小。 压缩包中的YN60LWo7.e文件很可能是一个易语言编译后的程序,它是源代码编译后的可执行文件...

    关于Gzip压缩js文件提高网站运行速度

    其中,通过使用Gzip压缩技术来减小JavaScript文件的大小,能够显著提升网站的加载速度,从而改善用户体验。Gzip是一种广泛使用的数据压缩算法,尤其适用于HTTP传输,因为它可以有效减少网络带宽的消耗。 **Gzip压缩...

    WIN2003下IIS6.0环境设置页面Gzip压缩.pdf

    标题提到的"WIN2003下IIS6.0环境设置页面Gzip压缩"是一个关于如何在Windows Server 2003上的Internet Information Services (IIS) 6.0中启用HTTP压缩,特别是使用Gzip算法来减小网页传输大小的技术主题。HTTP压缩是...

Global site tag (gtag.js) - Google Analytics