当前位置:首页 > PHP教程 > php高级应用 > 列表

php使用gzip压缩传输js和css文件的方法

发布:smiling 来源: PHP粉丝网  添加日期:2021-06-14 20:43:55 浏览: 评论:0 

这篇文章主要介绍了php使用gzip压缩传输js和css文件的方法,实例分析了使用gzip实现压缩js和css文件的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下

本文实例讲述了php使用gzip压缩传输js和css文件的方法。分享给大家供大家参考。具体如下:

  1. <?php 
  2.   /** 
  3.    * 完整调用示例: 
  4.    * 1、combine.php?t=j&b=public&fs=jslib.jquery,function 
  5.    *  
  6.    * 该例子调用的是网站根目录下的public/jslib/jquery.js和public/function.js 
  7.    *  
  8.    * 2、combine.php?t=j&fs=jslib.jquery,function 
  9.    *  
  10.    * 该例子调用的是网站根目录下的jslib/jquery.js和function.js 
  11.    *  
  12.    * 3、combine.php?t=c&b=public.css&fs=common,index 
  13.    *  
  14.    * 该例子调用的是网站根目录下的public/css/common.css和public/css/index.css 
  15.    *  
  16.    * 4、combine.php?t=c&fs=css.common 
  17.    * 该例子调用的是网站根目录下的css/common.css 
  18.    *  
  19.    * 注:多个文件名之间用,分隔;只有一个文件名最后不要有, 
  20.    *   用,分隔的多个文件会被压缩进一个文件,一次性传给浏览器 
  21.    **/ 
  22.   $is_bad_request=false; 
  23.   $cache = true; 
  24.   $doc_root_uri=$_SERVER['DOCUMENT_ROOT'].'/'
  25.   $cachedir = $doc_root_uri . 'public/cache'
  26.   //文件类型,j为js,c为css 
  27.   $type=isset($_GET['t'])?($_GET['t']=='j'||$_GET['t']=='c'?$_GET['t']:''):''
  28.   //存放js和css文件的基目录, 例如:?b=public.js 代表的是/public/js文件夹,出发点是网站根目录 
  29.   //基目录参数不是必须的,如果有基目录那么这个基目录就会附加在文件名之前 
  30.   $base =isset($_GET['b'])?($doc_root_uri.str_replace('.','/',$_GET['b'])):$doc_root_uri
  31.   //文件名列表,文件名不带后缀名.比如基目录是 
  32.   //文件名的格式是 :基目录(如果有)+文件包名+文件名 
  33.   //例如:类型是j, 
  34.   //   文件名public.js.jquery 
  35.   //   如果有基路径且为public, 
  36.   //   那么转换后的文件名就是/public/public/js/jquery.js 
  37.   //   如果没有基路径 
  38.   //   那么转换后的文件名就是/public/js/jquery.js 
  39.   //多个文件名之间用,分隔 
  40.   $fs=isset($_GET['fs'])?str_replace('.','/',$_GET['fs']):''
  41.   $fs=str_replace(',','.'.($type=='j'?'js,':'css,'),$fs); 
  42.   $fs=$fs.($type=='j'?'.js':'.css'); 
  43.   if($type==''||$fs==''){$is_bad_request=true;} 
  44.   //die($base); 
  45.   if($is_bad_request){header ("HTTP/1.0 503 Not Implemented");} 
  46.   $file_type=$type=='j'?'javascript':'css'
  47.   $elements = explode(',',preg_replace('/([^?]*).*/''\1'$fs)); 
  48.   // Determine last modification date of the files 
  49.   $lastmodified = 0; 
  50.   while (list(,$element) = each($elements)) { 
  51.     $path =$base . '/' . $element
  52.     if (($type == 'j' && substr($path, -3) != '.js') ||  
  53.       ($type == 'c' && substr($path, -4) != '.css')) { 
  54.       header ("HTTP/1.0 403 Forbidden"); 
  55.       exit;   
  56.     } 
  57.     if (substr($path, 0, strlen($base)) != $base || !file_exists($path)) { 
  58.       header ("HTTP/1.0 404 Not Found"); 
  59.       exit
  60.     } 
  61.     $lastmodified = max($lastmodifiedfilemtime($path)); 
  62.   } 
  63.   // Send Etag hash 
  64.   $hash = $lastmodified . '-' . md5($fs); 
  65.   header ("Etag: \"" . $hash . "\""); 
  66.   if (isset($_SERVER['HTTP_IF_NONE_MATCH']) &&  
  67.     stripslashes($_SERVER['HTTP_IF_NONE_MATCH']) == '"' . $hash . '"')  
  68.   { 
  69.     // Return visit and no modifications, so do not send anything 
  70.     header ("HTTP/1.0 304 Not Modified"); 
  71.     header ("Content-Type: text/" . $file_type); 
  72.     header ('Content-Length: 0'); 
  73.   }  
  74.   else 
  75.   { 
  76.     // First time visit or files were modified 
  77.     if ($cache)  
  78.     { 
  79.       // Determine supported compression method 
  80.       $gzip = strstr($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip'); 
  81.       $deflate = strstr($_SERVER['HTTP_ACCEPT_ENCODING'], 'deflate'); 
  82.       // Determine used compression method 
  83.       $encoding = $gzip ? 'gzip' : ($deflate ? 'deflate' : 'none'); 
  84.       // Check for buggy versions of Internet Explorer 
  85.       if (!strstr($_SERVER['HTTP_USER_AGENT'], 'Opera') &&  
  86.         preg_match('/^Mozilla\/4\.0 \(compatible; MSIE ([0-9]\.[0-9])/i'$_SERVER['HTTP_USER_AGENT'], $matches)) { 
  87.         $version = floatval($matches[1]); 
  88.         if ($version < 6) 
  89.           $encoding = 'none'
  90.         if ($version == 6 && !strstr($_SERVER['HTTP_USER_AGENT'], 'EV1'))  
  91.           $encoding = 'none'
  92.       } 
  93.       // Try the cache first to see if the combined files were already generated 
  94.       $cachefile = 'cache-' . $hash . '.' . $file_type . ($encoding != 'none' ? '.' . $encoding : ''); 
  95.       if (file_exists($cachedir . '/' . $cachefile)) { 
  96.         if ($fp = fopen($cachedir . '/' . $cachefile'rb')) { 
  97.           if ($encoding != 'none') { 
  98.             header ("Content-Encoding: " . $encoding); 
  99.           } 
  100.           header ("Content-Type: text/" . $file_type); 
  101.           header ("Content-Length: " . filesize($cachedir . '/' . $cachefile)); 
  102.           fpassthru($fp); 
  103.           fclose($fp); 
  104.           exit
  105.         } 
  106.       } 
  107.     } 
  108.     // Get contents of the files 
  109.     $contents = ''
  110.     reset($elements); 
  111.     while (list(,$element) = each($elements)) { 
  112.       $path = $base . '/' . $element
  113.       $contents .= "\n\n" . file_get_contents($path); 
  114.     } 
  115.     // Send Content-Type 
  116.     header ("Content-Type: text/" . $file_type); 
  117.     if (isset($encoding) && $encoding != 'none')  
  118.     { 
  119.       // Send compressed contents 
  120.       $contents = gzencode($contents, 9, $gzip ? FORCE_GZIP : FORCE_DEFLATE); 
  121.       header ("Content-Encoding: " . $encoding); 
  122.       header ('Content-Length: ' . strlen($contents)); 
  123.       echo $contents
  124.     }  
  125.     else 
  126.     { 
  127.       // Send regular contents 
  128.       header ('Content-Length: ' . strlen($contents)); 
  129.       echo $contents
  130.     } 
  131.     // Store cache 
  132.     if ($cache) { 
  133.       if ($fp = fopen($cachedir . '/' . $cachefile'wb')) { 
  134.         fwrite($fp$contents); 
  135.         fclose($fp); 
  136.       } 
  137.     } 
  138.   } 

希望本文所述对大家的php程序设计有所帮助。

Tags: gzip压缩 js css

分享到: