PHP zlib扩展实现页面GZIP压缩输出


Posted in PHP onJune 17, 2010

要实现GZIP压缩页面需要浏览器和服务器共同支持,实际上就是服务器压缩,传到浏览器后浏览器解压并解析。浏览器那边不需要我们担心,因为现在绝大多数浏览器都支持解析GZIP过的页面。我们只要把页面在服务器端压缩再输出到浏览器就行了。

有点罗嗦,下面说正事:

正如要制作压缩饼干,先要拿到原料,要压缩一个页面,首先要获得要输出的内容。PHP中的ob_start()(ob => output buffer)函数可以实现这个功能,它可以把程序里准备输出的内容先放到一个叫做“缓冲区”的地方,当然,你可以理解为制作压缩饼干的暂时放原料的工作台。
这个函数一定要在页面输出之前使用,所以一般把它放在代码的最顶端。因为它就像是一个工作台,所以你要在原料到来之前就要准备好它,否则原料来了没地方放,会出问题的。用ob_start()得到要压缩的页面之后,我们就可以制作压缩饼干了,不对,应该是可以压缩页面了!不过好像还缺少一台压缩机, EZ,我们用PHP带的zlib扩展做一台:

function ob_gzip($content) // $content 就是要压缩的页面内容,或者说饼干原料 
{ 
if( !headers_sent() && // 如果页面头部信息还没有输出 
extension_loaded("zlib") && // 而且zlib扩展已经加载到PHP中 
strstr($_SERVER["HTTP_ACCEPT_ENCODING"],"gzip")) //而且浏览器说它可以接受GZIP的页面 
{ 
$content = gzencode($content." \n//此页已压缩",9); 为准备压缩的内容贴上“//此页已压缩”的注释标签,然后用zlib提供的gzencode()函数执行级别为9的压缩,这个参数值范围是0-9,0表示无压缩,9表示最大压缩,当然压缩程度越高越费CPU。 //然后用header()函数给浏览器发送一些头部信息,告诉浏览器这个页面已经用GZIP压缩过了! 
header("Content-Encoding: gzip"); 
header("Vary: Accept-Encoding"); 
header("Content-Length: ".strlen($content)); 
} 
return $content; //返回压缩的内容,或者说把压缩好的饼干送回工作台。 
}

压缩机做好了之后,我们把压缩机放到工作台上,于是原来的ob_start()变成

ob_start('ob_gzip'); //没错,就是给ob_start()加一个参数,参数名就是我们刚才做的“压缩机”的函数名。这样当内容进入缓冲区后PHP就会调用ob_gzip函数把它压缩了。
好了,所有的工作已完成,最后交货:

ob_end_flush(); //结束缓冲区,输出内容。当然,不用这个函数也行,因为程序执行到最后会自动将缓冲区内容输出。
完整的示例如下:

<?php 
//启用一个带有ob_gzip压缩机的工作台 
ob_start('ob_gzip'); 
//准备一些待压缩的内容 
for($i=0; $i<100; $i++) 
{ 
echo('这里是压缩饼干的原料,这里是压缩饼干的原料,原料'); 
} 
//输出压缩成果 
ob_end_flush(); 
//这是ob_gzip压缩机 
function ob_gzip($content) 
{ 
if( !headers_sent() && 
extension_loaded("zlib") && 
strstr($_SERVER["HTTP_ACCEPT_ENCODING"],"gzip")) 
{ 
$content = gzencode($content." \n//此页已压缩",9); header("Content-Encoding: gzip"); 
header("Vary: Accept-Encoding"); 
header("Content-Length: ".strlen($content)); 
} 
return $content; 
} 
?>

经过实际测试,上面代码中如果不用GZIP,是4.69KB=4802.56B,启用GZIP后缩小为104B ,呃……我数学可能不好,自己算下压缩到了原来的百分之多少吧。。

另外,下面是用FlashGet获取的日志信息,可以看到我们程序里加的header信息:

Fri Jan 25 17:53:10 2008 HTTP/1.1 200 OK 
Fri Jan 25 17:53:10 2008 Server: Microsoft-IIS/5.1 
Fri Jan 25 17:53:10 2008 Date: Fri, 25 Jan 2008 09:53:10 GMT 
Fri Jan 25 17:53:10 2008 Connection: close 
Fri Jan 25 17:53:10 2008 X-Powered-By: PHP/5.2.5 
Fri Jan 25 17:53:10 2008 Content-Encoding: gzip 
Fri Jan 25 17:53:10 2008 Vary: Accept-Encoding 
Fri Jan 25 17:53:10 2008 Content-Length: 104 
Fri Jan 25 17:53:10 2008 Content-type: text/html
PHP 相关文章推荐
excellent!――ASCII Art(由目标图象生成ascii)
Feb 20 PHP
php仿QQ验证码的实例分析
Jul 01 PHP
php header功能的使用
Oct 28 PHP
php实现12306火车票余票查询和价格查询(12306火车票查询)
Jan 14 PHP
ThinkPHP3.1新特性之多数据库操作更加完善
Jun 19 PHP
destoon各类调用汇总
Jun 20 PHP
PHP实现自动登入google play下载app report的方法
Sep 23 PHP
通过PHP自带的服务器来查看正则匹配结果的方法
Dec 24 PHP
PHP下使用mysqli的函数连接mysql出现warning: mysqli::real_connect(): (hy000/1040): ...
Feb 14 PHP
php上传后台无法收到数据解决方法
Oct 28 PHP
laravel框架中表单请求类型和CSRF防护实例分析
Nov 23 PHP
php中数组最简单的使用方法
Dec 27 PHP
PHP,ASP.JAVA,JAVA代码格式化工具整理
Jun 15 #PHP
PHP迅雷、快车、旋风下载专用链转换代码
Jun 15 #PHP
PHP中实现汉字转区位码应用源码实例解析
Jun 14 #PHP
joomla内置的表单验证功能使用方法
Jun 11 #PHP
实战mysql导出中文乱码及phpmyadmin导入中文乱码的解决方法
Jun 11 #PHP
Php获取金书网的书名的实现代码
Jun 11 #PHP
PHP中json_encode、json_decode与serialize、unserialize的性能测试分析
Jun 09 #PHP
You might like
ThinkPHP php 框架学习笔记
2009/10/30 PHP
PHP定时自动生成静态HTML的实现代码
2010/06/20 PHP
django中的ajax组件教程详解
2018/10/18 PHP
jQuery 开天辟地入门篇一
2009/12/09 Javascript
入门基础学习 ExtJS笔记(一)
2010/11/11 Javascript
zShowBox 图片放大展示jquery版 兼容性
2011/09/24 Javascript
拥抱模块化的JavaScript
2012/03/07 Javascript
jQuery仿Excel表格编辑功能的实现代码
2013/05/01 Javascript
a标签的href和onclick 的事件的区别介绍
2013/07/26 Javascript
jQuery控制TR显示隐藏的几种方法
2014/06/18 Javascript
node.js中的定时器nextTick()和setImmediate()区别分析
2014/11/26 Javascript
JQuery控制div外点击隐藏而div内点击不会隐藏的方法
2015/01/13 Javascript
javascript中alert()与console.log()的区别
2015/08/26 Javascript
JS+CSS实现简单滑动门(滑动菜单)效果
2015/09/19 Javascript
滚动条的监听与内容随着滚动条动态加载的实现
2017/02/08 Javascript
JavaScript实现二分查找实例代码
2017/02/22 Javascript
webpack热模块替换(HMR)/热更新的方法
2018/04/05 Javascript
使用jQuery给Table动态增加行、清空table的方法
2018/09/05 jQuery
nodejs异步编程基础之回调函数用法分析
2018/12/26 NodeJs
微信小程序实现简单跑马灯效果
2020/05/26 Javascript
ES6知识点整理之Proxy的应用实例详解
2019/04/16 Javascript
微信小程序拼接图片链接无底洞深入探究
2019/09/03 Javascript
javscript 数组扁平化的实现
2020/02/03 Javascript
一文秒懂nodejs中的异步编程
2021/01/28 NodeJs
Python中内建函数的简单用法说明
2016/05/05 Python
python利用标准库如何获取本地IP示例详解
2017/11/01 Python
从DataFrame中提取出Series或DataFrame对象的方法
2018/11/10 Python
python实现递归查找某个路径下所有文件中的中文字符
2019/08/31 Python
Python实现的爬取豆瓣电影信息功能案例
2019/09/15 Python
GoDaddy英国:全球排名第一的域名注册商
2018/06/08 全球购物
JavaScript获取当前url根目录(路径)
2014/02/19 面试题
十八大闭幕感言
2014/01/22 职场文书
护理专业自荐书
2014/06/04 职场文书
小学校园广播稿集锦
2014/10/04 职场文书
《曹冲称象》教学反思
2016/02/20 职场文书
Win11怎么跳过联网验机 ?Win11跳过联网验机激活教程
2022/04/05 数码科技