• gzip.php改良版

    gzip.php改良版
     
    $key已经确定了某个文件的唯一性,所以把原来的文件名处理换了,并加上$ht_dir。因为$key是来自$_SERVER['QUERY_STRING']的变量,与htaccess位置有关。
    缓存的生成与当前文件目录无关,所以采用$cachedir指定相对网站根目录,存放gz文件的目录。
    相对原版,程序体更改了js的文件类型,更符合规范。更改了$filename和$cache_filename两个变量,并添加了$cur_dir变量设定和$ws_dir变量。同时删除一些改动后已经无用的中间变量。
    如果已经用了php_flag zlib.output_compression on来压缩PHP,那么在放置gzip.php的目录下加上一个.htaccess,里面写上“php_flag zlib.output_compression off”。避免连续压缩两次而出错。
     
    如果更新了CSS文件,记得手动删除对应缓存哦!
    对应Rewrite规则:
    #gzip for css and js
    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    #RewriteCond %{HTTP:Accept-encoding} gzip #据说有些防火墙阻挡这个请求,而且大部分都支持Gzip,所以注释掉,不再判断。
    RewriteCond %{REQUEST_FILENAME} ^.*\.(css|js)$
    #RewriteCond %{REQUEST_FILENAME} -f #gzip.php已经有判断文件是否存在,故这里是否判断都没关系,交给gzip.php处理。
    RewriteRule (.*.css$|.*.js$) /wp-content/gzip-cache/gzip.php?$1 [L]
    </IfModule>
    #END gzip for css and js
    这个改良版程序支持针对某子目录的页面的gzip压缩。具体终极完美使用下次再说。
     
    改良gzip.php,支持Win和*nix主机。原版来自:http://www.cbmland.com/post/522/optimized-wordpress-notes-1.html Rewrite参考:这里
    改良gzip.php代码:
    <?php
    //注:本文件需要在其目录下关闭Gzip压缩PHP!
    $cur_dir = 'wp-content/gzip-cache/';//相对网站根目录,本文件的目录
    $cache = false;//Gzip压缩开关
    $cachedir = 'wp-content/gzip-cache/';//相对网站根目录,存放gz文件的目录,确保可写
    $ht_dir = '';//相对网站根目录,使gzip生效的.htaccess文件存放目录
    $ws_dir = dirname(__FILE__);
    $ws_dir = str_replace('\\','/',$ws_dir).'/';
    $ws_dir = str_replace($cur_dir,'',$ws_dir);//计算出网站根目录的绝对路径
    $gzip = strstr($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip');
    $deflate = strstr($_SERVER['HTTP_ACCEPT_ENCODING'], 'deflate');
    $encoding = $gzip ? 'gzip' : ($deflate ? 'deflate' : 'none');
     
    if(!isset($_SERVER['QUERY_STRING'])) exit();
     
    $key=array_shift(explode('?', $_SERVER['QUERY_STRING']));
    $key=str_replace('../','',$key);
    $filename=$ws_dir.$ht_dir.$key;//要压缩的文件的绝对路径
     
    $symbol='^';
    $cache_filename=$ws_dir.$cachedir.str_replace('/',$symbol,$key).'.gz';//生成gz文件路径
    $type="Content-type: text/html"; //默认的类型信息
     
    $ext = array_pop(explode('.', $filename));//根据后缀判断文件类型信息
     switch ($ext){
      case 'css':
       $type="Content-type: text/css";
       break;
      case 'js':
       $type="Content-type: application/x-javascript";
       break;
      default:
       exit();
     }
     
    if($cache){
     if(file_exists($cache_filename)){//假如存在gz文件
     
     
      $mtime = filemtime($cache_filename);
      $gmt_mtime = gmdate('D, d M Y H:i:s', $mtime) . ' GMT';
     
      if( (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) &&
            array_shift(explode(';', $_SERVER['HTTP_IF_MODIFIED_SINCE'])) ==  $gmt_mtime)
       ){
     
       // 浏览器cache中的文件修改日期是否一致,将返回304
       header ("HTTP/1.1 304 Not Modified");
       header("Expires: ");
       header("Cache-Control: ");
       header("Pragma: ");
       header($type);
       header("Tips: Cache Not Modified (Gzip)");
       header ('Content-Length: 0');
     
     
      }else{
     
       //读取gz文件输出
       $content = file_get_contents($cache_filename);
       header("Last-Modified:" . $gmt_mtime);
       header("Expires: ");
       header("Cache-Control: ");
       header("Pragma: ");
       header($type);
       header("Tips: Normal Respond (Gzip)");
       header("Content-Encoding: gzip");
       echo $content;
      }
     
     
     }else if(file_exists($filename)){//没有对应的gz文件
     
      $mtime = mktime();
      $gmt_mtime = gmdate('D, d M Y H:i:s', $mtime) . ' GMT';
     
      $content = file_get_contents($filename);//读取文件
      $content = gzencode($content, 9, $gzip ? FORCE_GZIP : FORCE_DEFLATE);//压缩文件内容
     
      header("Last-Modified:" . $gmt_mtime);
      header("Expires: ");
      header("Cache-Control: ");
      header("Pragma: ");
      header($type);
      header("Tips: Build Gzip File (Gzip)");
      header ("Content-Encoding: " . $encoding);
            header ('Content-Length: ' . strlen($content));
      echo $content;
     
      if ($fp = fopen($cache_filename, 'w')) {//写入gz文件,供下次使用
                    fwrite($fp, $content);
                    fclose($fp);
                }
     
     }else{
      header("HTTP/1.0 404 Not Found");
      echo "<!--404 Not Found-->";
     }
    }else{ //处理不使用Gzip模式下的输出。原理基本同上
     if(file_exists($filename)){
      $mtime = filemtime($filename);
      $gmt_mtime = gmdate('D, d M Y H:i:s', $mtime) . ' GMT';
     
      if( (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) &&
      array_shift(explode(';', $_SERVER['HTTP_IF_MODIFIED_SINCE'])) ==  $gmt_mtime)
      ){
     
      header ("HTTP/1.1 304 Not Modified");
      header("Expires: ");
      header("Cache-Control: ");
      header("Pragma: ");
      header($type);
      header("Tips: Cache Not Modified");
      header ('Content-Length: 0');
     
     }else{
     
      header("Last-Modified:" . $gmt_mtime);
      header("Expires: ");
      header("Cache-Control: ");
    &
    nbsp; header("Pragma: ");
      header($type);
      header("Tips: Normal Respond");
      $content = readfile($filename);
      echo $content;
     
      }
     }else{
      header("HTTP/1.0 404 Not Found");
      echo "<!--404 Not Found-->";
     }
    }
     
    ?>

     

    分类: 所谓技术 | 标签: ,,