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 相关文章推荐
推荐Discuz!5的PHP代码高亮显示与实现可运行代码
Mar 15 PHP
php foreach、while性能比较
Oct 15 PHP
session在PHP大型web应用中的使用
Jun 25 PHP
PHP获取当前日期所在星期(月份)的开始日期与结束日期(实现代码)
Jun 18 PHP
解析使用substr截取UTF-8中文字符串出现乱码的问题
Jun 20 PHP
Yii2增加验证码步骤详解
Apr 25 PHP
PHP抓取远程图片(含不带后缀的)教程详解
Oct 21 PHP
php取出数组单个值的方法
Mar 12 PHP
PHP基于rabbitmq操作类的生产者和消费者功能示例
Jun 16 PHP
详解php用static方法的原因
Sep 12 PHP
PHP进阶学习之类的自动加载机制原理分析
Jun 18 PHP
PHP实现的抓取小说网站内容功能示例
Jun 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
PHP 页面编码声明方法详解(header或meta)
2010/03/12 PHP
PHP闭包(Closure)使用详解
2013/05/02 PHP
php+mysql结合Ajax实现点赞功能完整实例
2015/01/30 PHP
php找出指定范围内回文数且平方根也是回文数的方法
2015/03/23 PHP
PHP实现在windows下配置sendmail并通过mail()函数发送邮件的方法
2017/06/20 PHP
DHTML 中的绝对定位
2006/11/26 Javascript
基于js disabled=&quot;false&quot;不起作用的解决办法
2013/06/26 Javascript
js形成页面的一种遮罩效果实例代码
2014/01/04 Javascript
innerText 使用示例
2014/01/23 Javascript
jquery提交form表单时禁止重复提交的方法
2014/02/13 Javascript
jQuery height()、innerHeight()、outerHeight()函数的区别详解
2016/05/23 Javascript
微信小程序 后台https域名绑定和免费的https证书申请详解
2016/11/10 Javascript
详解webpack异步加载业务模块
2017/06/23 Javascript
Vue.js数据绑定之data属性
2017/07/07 Javascript
javascript实现电脑和手机版样式切换
2017/11/10 Javascript
p5.js入门教程之小球动画示例代码
2018/03/15 Javascript
Vue官方推荐AJAX组件axios.js使用方法详解与API
2018/10/09 Javascript
在element-ui的el-tree组件中用render函数生成el-button的实例代码
2018/11/05 Javascript
个人小程序接入支付解决方案
2019/05/23 Javascript
webpack.DefinePlugin与cross-env区别详解
2020/02/23 Javascript
关于python2 csv写入空白行的问题
2018/06/22 Python
pyautogui自动化控制鼠标和键盘操作的步骤
2020/04/01 Python
django Layui界面点击弹出对话框并请求逻辑生成分页的动态表格实例
2020/05/12 Python
python破解同事的压缩包密码
2020/10/14 Python
Python 实现PS滤镜中的径向模糊特效
2020/12/03 Python
会计专业大学生求职信范文
2014/01/28 职场文书
汽车队司机先进事迹材料
2014/02/01 职场文书
酒店秘书求职信范文
2014/02/17 职场文书
关于读书的活动方案
2014/08/14 职场文书
大型主题婚礼活动策划方案
2014/09/15 职场文书
无子女夫妻离婚协议书(4篇)
2014/10/20 职场文书
2014年学校办公室工作总结
2014/12/19 职场文书
幼儿园教师考核评语
2014/12/31 职场文书
国庆阅兵观后感
2015/06/15 职场文书
2016大学迎新晚会开场白
2015/11/24 职场文书
高端收音机+蓝牙音箱,JBL TUNER FM带收音蓝牙音箱评测
2021/04/24 无线电