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-->";
 }
}
 
?>

 

1 comment

  1. 莫海铭 says:

    老大,你可以指导一下我配置GZIP吗?

Leave a comment