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

来源:互联网 发布:林弯弯的淘宝店外套 编辑:程序博客网 时间:2024/05/22 03:37
<?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);  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)      {          // 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);          }      }  }
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 乐视手机耗电快怎么办 乐视手机费电快怎么办 最爱最恨都是你怎么办 耳朵长疱疹很痛怎么办 刚怀孕就有霉菌怎么办 车牌选错了想换怎么办 足癣传染到身上怎么办 金鱼生病了立鳞怎么办 脸上有闭口痘痘怎么办 泰迪得了皮肤癣怎么办 qq截图发不出去怎么办 半夜2点肚子饿怎么办 半夜两三点饿了怎么办 科目三预约不上怎么办 心脏支架又堵了怎么办 车辆验车过期了怎么办 车辆年审过期2天怎么办 违停单子丢了怎么办 沙发弹簧包坏了怎么办 bt种子被和谐了怎么办 苹果手机id密码忘了怎么办 墙漆颜色太深了怎么办 油漆颜色太深了怎么办 墙面漆颜色太深怎么办 古代打仗牙掉了怎么办 乐视电视没声音怎么办 老公疑心病很重怎么办啊 被安装了尿道锁怎么办 狼青小狗腿罗圈怎么办 备孕期间有霉菌怎么办 虫子进皮肤里了怎么办 生完孩子肚子越来越大怎么办 怀孕8个月肚子小怎么办 孕晚期胎儿不长怎么办 肚子上肉特别多怎么办 奶堵了有硬块怎么办 便秘5天肚子胀怎么办 上火大便拉不出来怎么办 大便拉不出来肚子痛怎么办 戒奶奶涨有硬块怎么办 忌奶的时候涨奶怎么办