1. [代码][PHP]代码    
<?php
 
    /**
     *  完整调用示例:
     *  1、combine.php?t=j&b=public&fs=jslib.jquery,function
     *  
     *  该例子调用的是网站根目录下的public/jslib/jquery.js和public/function.js
 
     *  
     *  2、combine.php?t=j&fs=jslib.jquery,function
     *  
     *  该例子调用的是网站根目录下的jslib/jquery.js和function.js
     *  
     *  3、combine.php?t=c&b=public.css&fs=common,index
     *  
     *  该例子调用的是网站根目录下的public/css/common.css和public/css/index.css
     *  
     *  4、combine.php?t=c&fs=css.common
     *  该例子调用的是网站根目录下的css/common.css
     *  
     *  注:多个文件名之间用,分隔;只有一个文件名最后不要有,
     *     用,分隔的多个文件会被压缩进一个文件,一次性传给浏览器
     **/
    $is_bad_request=false;
    $cache = true;
    $doc_root_uri=$_SERVER['DOCUMENT_ROOT'].'/';
    $cachedir = $doc_root_uri . 'public/cache';
    //文件类型,j为js,c为css
    $type=isset($_GET['t'])?($_GET['t']=='j'||$_GET['t']=='c'?$_GET['t']:''):'';
     
    //存放js和css文件的基目录, 例如:?b=public.js 代表的是/public/js文件夹,出发点是网站根目录
    //基目录参数不是必须的,如果有基目录那么这个基目录就会附加在文件名之前
    $base =isset($_GET['b'])?($doc_root_uri.str_replace('.','/',$_GET['b'])):$doc_root_uri;
     
    //文件名列表,文件名不带后缀名.比如基目录是
    //文件名的格式是 :基目录(如果有)+文件包名+文件名
    //例如:类型是j,
    //     文件名public.js.jquery
    //     如果有基路径且为public,
    //     那么转换后的文件名就是/public/public/js/jquery.js
    //     如果没有基路径
    //     那么转换后的文件名就是/public/js/jquery.js
    //多个文件名之间用,分隔
    $fs=isset($_GET['fs'])?str_replace('.','/',$_GET['fs']):'';
    $fs=str_replace(',','.'.($type=='j'?'js,':'css,'),$fs);
    $fs=$fs.($type=='j'?'.js':'.css');
     
     
     
    if($type==''||$fs==''){$is_bad_request=true;}
    //die($base);
    ///////////////http://blog.ddian.cn
    if($is_bad_request){header ("HTTP/1.0 503 Not Implemented");}
     
     
    $file_type=$type=='j'?'javascript':'css';
     
    $elements = explode(',',preg_replace('/([^?]*).*/', '\1', $fs));
     
    // Determine last modification date of the files
    $lastmodified = 0;
    while (list(,$element) = each($elements)) {
        $path =$base . '/' . $element;
     
        if (($type == 'j' && substr($path, -3) != '.js') || 
            ($type == 'c' && substr($path, -4) != '.css')) {
            header ("HTTP/1.0 403 Forbidden");
            exit;   
        }
     
        if (substr($path, 0, strlen($base)) != $base || !file_exists($path)) {
            header ("HTTP/1.0 404 Not Found");
            exit;
        }
         
        $lastmodified = max($lastmodified, filemtime($path));
    }
     
    // Send Etag hash
    $hash = $lastmodified . '-' . md5($fs);
    header ("Etag: \"" . $hash . "\"");
     
    if (isset($_SERVER['HTTP_IF_NONE_MATCH']) && 
        stripslashes($_SERVER['HTTP_IF_NONE_MATCH']) == '"' . $hash . '"') 
    {
        // Return visit and no modifications, so do not send anything
        header ("HTTP/1.0 304 Not Modified");
        header ("Content-Type: text/" . $file_type);
        header ('Content-Length: 0');
    } 
    else
    {
        // First time visit or files were modified
        if ($cache) flash插件
        {​http://www.huiyi8.com/flashchajian/​
            // Determine supported compression method
            $gzip = strstr($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip');
            $deflate = strstr($_SERVER['HTTP_ACCEPT_ENCODING'], 'deflate');
     
            // Determine used compression method
            $encoding = $gzip ? 'gzip' : ($deflate ? 'deflate' : 'none');
     
            // Check for buggy versions of Internet Explorer
            if (!strstr($_SERVER['HTTP_USER_AGENT'], 'Opera') && 
                preg_match('/^Mozilla\/4\.0 \(compatible; MSIE ([0-9]\.[0-9])/i', $_SERVER['HTTP_USER_AGENT'], $matches)) {
                $version = floatval($matches[1]);
                 
                if ($version < 6)
                    $encoding = 'none';
                     
                if ($version == 6 && !strstr($_SERVER['HTTP_USER_AGENT'], 'EV1')) 
                    $encoding = 'none';
            }
             
            // Try the cache first to see if the combined files were already generated
            $cachefile = 'cache-' . $hash . '.' . $file_type . ($encoding != 'none' ? '.' . $encoding : '');
             
            if (file_exists($cachedir . '/' . $cachefile)) {
                if ($fp = fopen($cachedir . '/' . $cachefile, 'rb')) {
 
                    if ($encoding != 'none') {
                        header ("Content-Encoding: " . $encoding);
                    }
                 
                    header ("Content-Type: text/" . $file_type);
                    header ("Content-Length: " . filesize($cachedir . '/' . $cachefile));
                    fpassthru($fp);
                    fclose($fp);
                    exit;
                }
            }
        }
     
        // Get contents of the files
        $contents = '';
        reset($elements);
        while (list(,$element) = each($elements)) {
            $path = $base . '/' . $element;
            $contents .= "\n\n" . file_get_contents($path);
        }
     
        // Send Content-Type
        header ("Content-Type: text/" . $file_type);
         
        if (isset($encoding) && $encoding != 'none') 
        {
            // Send compressed contents
            $contents = gzencode($contents, 9, $gzip ? FORCE_GZIP : FORCE_DEFLATE);
            header ("Content-Encoding: " . $encoding);
            header ('Content-Length: ' . strlen($contents));
            echo $contents;
        } 
        else
        {
            // Send regular contents
            header ('Content-Length: ' . strlen($contents));
            echo $contents;
        }
 
        // Store cache
        if ($cache) {
            if ($fp = fopen($cachedir . '/' . $cachefile, 'wb')) {
                fwrite($fp, $contents);
                fclose($fp);
            }
        }
    }

php gizp压缩传输js和css文件的更多相关文章

  1. 引用:使用grunt 压缩 合并js、css文件

    引用:https://www.jianshu.com/p/08c7babdec65 压缩 js 文件 1.创建一个目录 名为grunt   目录.png 2.在grunt目录下创建一个 src目录,存 ...

  2. grunt 单独压缩多个js和css文件【转】

    原文地址:http://xiaomiya.iteye.com/blog/2177877 使用grunt来压缩前端js,css文件 因为最近做的客户端本地项目有用到十几个js,js提交之前都需要压缩.用 ...

  3. 项目中对模板和js,css文件进行压缩的处理类

    我们知道,在html的页面中,所有空格和换行符其实都会占据一定的空间,即使使用了gzip压缩,在传输过程中依然会浪费用户的流量和我们自己服务器的带宽,此脚本就是为了解决这个问题而诞生的. 请自行下载G ...

  4. 【翻译】Microsoft Ajax Minifier 快速使用指南(与VS集成使用) 编译后直接压缩项目的JS或CSS文件

    网上找了好久终于找到一个能跟VS集成使用的JS和CSS压缩工具,因为害怕忘记,所以给转发过来,顺便翻译一下,大学那会儿学的英语基本上都已经还给老师了,所以翻译的不太好,不过能看懂就成,对吧? 原文地址 ...

  5. [Asp.net MVC]Bundle合并,压缩js、css文件

    摘要 在web优化中有一种手段,压缩js,css文件,减少文件大小,合并js,css文件减少请求次数.asp.net mvc中为我们提供一种使用c#代码压缩合并js和css这类静态文件的方法. 一个例 ...

  6. [转][前端优化]使用Combres合并对js、css文件的请求

    本文转自:http://www.cnblogs.com/parry/archive/2011/01/28/Reduce_Http_Request_Using_Combres_For_Js_Css.ht ...

  7. 第十一节:Bundles压缩合并js和css及原理分析

    一. 简介 1.背景:浏览器默认一次性请求的网络数是有上限的,如果你得js和css文件太多,就会导致浏览器需要多次加载,影响页面的加载速度, MVC中提供Bundles的方式压缩合并js和css,是M ...

  8. js或css文件后面的参数是什么意思?

    经常看到不少导航网站测样式或js文件后面加了一些参数,主要是一你为一些并不经常更新的页面重新加载新修改的文件. 经常遇到页面里加载的js与css文件带有参数,比如: <script type=& ...

  9. MVC学习随笔----如何在页面中添加JS和CSS文件

    http://blog.csdn.net/xxjoy_777/article/details/39050011 1.如何在页面中添加Js和CSS文件. 我们只需要在模板页中添加JS和CSS文件,然后子 ...

随机推荐

  1. mysqldump默认参数add-drop-table

    mysqldump默认参数add-drop-table 原创 2014年01月28日 11:35:18 9214 接到一个同事电话,说UAT环境上的一张表被删了,要恢复一下.原来是新项目UAT,从测试 ...

  2. 13 Memcached 永久数据被踢现象

    一:Memcached 永久数据被踢现象(1)网上有人反映"memcached"数据丢失,明明设为永久不失效,却莫名其妙的丢失了. 其实这要从2个方面来找原因. 即使前面介绍的惰性 ...

  3. JSP隐式对象是JSP容器为每个页面提供的Java对象

    JSP 隐式对象 JSP隐式对象是JSP容器为每个页面提供的Java对象,开发者可以直接使用它们而不用显式声明.JSP隐式对象也被称为预定义变量. JSP所支持的九大隐式对象: 对象 描述 reque ...

  4. c++中如何查看一个类的内存布局

    打开VS command prompt,输入下述命令可以看到对象的内存布局. cl a.cpp -d1 reportSingleClassLayout[classname] //  reportSin ...

  5. Python中使用 Selenium 实现网页截图实例

    Selenium 是一个可以让浏览器自动化地执行一系列任务的工具,常用于自动化测试.不过,也可以用来给网页截图.目前,它支持 Java.C#.Ruby 以及 Python 四种客户端语言.如果你使用 ...

  6. 走进Struts2(五)— 值栈和OGNL

    值栈 1.值栈是什么? 简单说:就是相应每个请求对象的轻量级的内存数据中心. Struts2引入值栈最大的优点就是:在大多数情况下,用户根本无须关心值栈,无论它在哪里,不用管它里面有什么,仅仅须要去获 ...

  7. Oracle中NVL、NVL2、NULLIF 三个函数的区别?

    首先说明:NULL指的是空值,或者非法值. 1.NVL (expr1, expr2)expr1为NULL,返回expr2:不为NULL,返回expr1.注意两者的类型要一致 2.NVL2 (expr1 ...

  8. 6.1-AliasRegistry

    AliasRegistry //AliasRegistry package org.springframework.core; /** * Common interface for managing ...

  9. iOS 符号化崩溃日志

    1.获取一下三个文件   1. crash报告(.crash文件) 2. 符号文件 (.dsymb文件) 3. 应用程序文件 (appName.app文件,把IPA文件后缀改为zip,然后解压,Pay ...

  10. 【译】前端开发者都应知道的 jQuery 小技巧

    回到顶部按钮 通过使用 jQuery 中的 animate 和 scrollTop 方法,你无需插件便可创建一个简单地回到顶部动画: // Back to top $('a.top').click(f ...