Rumah >pembangunan bahagian belakang >tutorial php >PHP网站程序中开启Gzip压缩的两种方法
gzip是一种网络数据压缩传输技巧,可以让我们的带宽省70%左右,可以大大加快网页打开速度,不仅有利于用户体验,也能节约不少带宽。一般apache、Nginx等在配置文件中就能开启Gzip服务。下面我们来谈谈怎么在php网站程序中开启Gzip压缩服务:
1、在.htaccess 中添加如下代码:
<p>AddHandler application/x-httpd-php .css .html .js <br /></p><p> #这是添加你要压缩的类型 <br /></p><p>php_value auto_prepend_file “/home/a4284418/public_html/gzip.php” <br /></p><p> #这是你给这些类型增加一个自动运行的php代码,后面一定要填你空间的绝对地址 </p>
<p><?php <br /></p><p>ob_start(“ob_gzhandler”); <br /></p><p>ob_start(“compress”); <br /></p><p>$pathinfo = pathinfo($_SERVER[PHP_SELF]); <br /></p><p>switch ($pathinfo['extension']) { <br /></p><p>case “css” : <br /></p><p>header(“Content-type: text/css”); <br /></p><p>break; //scutephp.com</p><p> case “html” : <br /></p><p>header(“Content-type: text/html”); <br /></p><p>break; <br /></p><p>case “js” : <br /></p><p>header(“Content-type: text/javascript”); <br /></p><p>break; <br /></p><p>default : <br /></p><p>break;</p><p> } <br /></p><p>?></p>
此种方案是gzip的升级版,可以将gzip的压缩文件缓存下来,避免重复压缩,
1、在.htaccess 中添加:
htaccess RewriteRule (.*.css$|.*.js$) gzip.php?$1 [L],
代码如下:
<p><?php <br /></p><p>// htaccess <br /></p><p>RewriteRule (.*.css$|.*.js$) gzip.php?$1 [L] //项目根路径 <br /></p><p>define(‘ABSPATH’, dirname(__FILE__).’/'); //Gzip压缩开关 <br /></p><p>$cache = true; //存放gz文件的目录,确保可写</p><p>$cachedir = ‘gzip-cache/’;</p><p>if (!is_dir(ABSPATH.$cachedir)) { <br /></p><p>mkdir(ABSPATH.$cachedir); } //判断是否支持gzip <br /></p><p>$gzip = strstr($_SERVER['HTTP_ACCEPT_ENCODING'], ‘gzip’);</p><p>$deflate = strstr($_SERVER['HTTP_ACCEPT_ENCODING'], ‘deflate’); //看浏览器是否支持gzip 否则就是 deflate,再就是 none <br /></p><p>$encoding = $gzip ? ‘gzip’ : ($deflate ? ‘deflate’ : ‘none’); <br /></p><p>if(!isset($_SERVER['QUERY_STRING'])) exit(); <br /></p><p>//$key=array_shift(explode(‘?’, $_SERVER['QUERY_STRING'])); <br /></p><p>//$key=str_replace(‘../’,”,$key); <br /></p><p>$key =basename($_SERVER['QUERY_STRING']); //文件的绝对路径 <br /></p><p>$filename=ABSPATH.$_SERVER['QUERY_STRING']; <br /></p><p>$symbol=’^'; $rel_path=str_replace(ABSPATH,”,dirname($filename)); <br /></p><p>$namespace=str_replace(‘/’,$symbol,$rel_path); <br /></p><p>$cache_filename=ABSPATH.$cachedir.$namespace.$symbol.basename($filename).’.gz’;//生成gz文件路径 <br /></p><p>$type=”Content-type: text/html”; //默认的类型信息 <br /></p><p>$pathInfo = pathinfo($filename); //根据后缀判断文件类型信息 <br /></p><p>$ext = $pathInfo['extension']; <br /></p><p>switch ($ext){ <br /></p><p>case ‘css’: <br /></p><p>$type=”Content-type: text/css”; break; case ‘js’: <br /></p><p>$type=”Content-type: text/javascript”; <br /></p><p>break; <br /></p><p>default: <br /></p><p>exit(); <br /></p><p>} <br /></p><p>if($cache) { <br /></p><p>if(file_exists($cache_filename)) { //假如存在gz文件 <br /></p><p>$mtime = filemtime($cache_filename); <br /></p><p>$gmt_mtime = gmdate(‘D, d M Y H:i:s’, $mtime) . ‘ GMT’; //读取gz文件输出 <br /></p><p>$content = file_get_contents($cache_filename); <br /></p><p>header(“Last-Modified:” . $gmt_mtime); <br /></p><p>header(“Expires: “); header(“Cache-Control: “); <br /></p><p>header(“Pragma: “); <br /></p><p>header($type); <br /></p><p>header(“Tips: Normal Respond (Gzip)”); <br /></p><p>header(“Content-Encoding: gzip”); <br /></p><p>echo $content; <br /></p><p>}else if(file_exists($filename)) { //没有对应的gz文件 <br /></p><p>$mtime = mktime(); <br /></p><p>$gmt_mtime = gmdate(‘D, d M Y H:i:s’, $mtime) . ‘ GMT’; <br /></p><p>$content = file_get_contents($filename);//读取文件 <br /></p><p>$content = gzencode($content, 9, $gzip ? FORCE_GZIP : FORCE_DEFLATE);//压缩文件内容 <br /></p><p>header(“Last-Modified:” . $gmt_mtime); <br /></p><p>header(“Expires: “); <br /></p><p>header(“Cache-Control: “); <br /></p><p>header(“Pragma: “); <br /></p><p>header($type); <br /></p><p>header(“Tips: Build Gzip File (Gzip)”); header (“Content-Encoding: ” . $encoding); <br /></p><p>header (‘Content-Length: ‘ . strlen($content)); if ($fp = fopen($cache_filename, ‘w’)) { //写入gz文件,供下次使用 <br /></p><p>fwrite($fp, $content); fclose($fp); <br /></p><p>} <br /></p><p>echo $content; <br /></p><p>}else{ <br /></p><p>header(“HTTP/1.0 404 Not Found”);</p><p>} <br /></p><p>}else { //处理不使用Gzip模式下的输出。原理基本同上 if(file_exists($filename)) { <br /></p><p>$mtime = filemtime($filename); <br /></p><p>$gmt_mtime = gmdate(‘D, d M Y H:i:s’, $mtime) . ‘ GMT’; <br /></p><p>header(“Last-Modified:” . $gmt_mtime); <br /></p><p>header(“Expires: “); <br /></p><p>header(“Cache-Control: “); <br /></p><p>header(“Pragma: “); <br /></p><p>header($type); <br /></p><p>header(“Tips: Normal Respond”); <br /></p><p>$content = readfile($filename); <br /></p><p>echo $content;</p><p> }else { <br /></p><p>header(“HTTP/1.0 404 Not Found”); <br /></p><p>}</p><p> } <br /></p><p>?></p>