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 相关文章推荐
谈谈PHP语法(2)
Oct 09 PHP
Breeze 文章管理系统 v1.0.0正式发布
Dec 14 PHP
PHP XML备份Mysql数据库
May 27 PHP
php的字符串用法小结
Jun 08 PHP
PHP下使用CURL方式POST数据至API接口的代码
Feb 14 PHP
PHP5中GD库生成图形验证码(有汉字)
Jul 28 PHP
根据中文裁减字符串函数的php代码
Dec 03 PHP
两种设置php载入页面时编码的方法
Jul 29 PHP
PHP中变量引用与变量销毁机制分析
Nov 15 PHP
PHP开发中csrf攻击的简单演示和防范
May 07 PHP
PHP实现生成模糊图片的方法示例
Dec 21 PHP
PHP中in_array的隐式转换的解决方法
Mar 06 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开发的一些注意点总结
2010/10/12 PHP
编写PHP脚本使WordPress的主题支持Widget侧边栏
2015/12/14 PHP
ThinkPHP框架搭建及常见问题(XAMPP安装失败、Apache/MySQL启动失败)
2016/04/15 PHP
php将print_r处理后的数据还原为原始数组的解决方法
2016/11/02 PHP
php实现的简单多进程服务器类完整示例
2020/02/01 PHP
在IE上直接编辑网页内容的js代码(IE地址栏js)
2009/04/27 Javascript
使用SyntaxHighlighter实现HTML高亮显示代码的方法
2010/02/04 Javascript
利用js实现遮罩以及弹出可移动登录窗口
2013/07/08 Javascript
jQuery+CSS3实现树叶飘落特效
2015/02/01 Javascript
JS动态修改图片的URL(src)的方法
2015/04/01 Javascript
JS如何判断是否为ie浏览器的方法(包括IE10、IE11在内)
2015/12/13 Javascript
在IE8上JS实现combobox支持拼音检索功能
2016/05/23 Javascript
Angular2下使用pdf插件的方法详解
2017/04/29 Javascript
vue 2.0项目中如何引入element-ui详解
2017/09/06 Javascript
Vue引入sass并配置全局变量的方法
2018/06/27 Javascript
js实现上下左右键盘控制div移动
2020/01/16 Javascript
详解JS函数防抖
2020/06/05 Javascript
python抓取某汽车网数据解析html存入excel示例
2013/12/04 Python
Python实现对PPT文件进行截图操作的方法
2015/04/28 Python
Python基础语法(Python基础知识点)
2016/02/28 Python
Django的信号机制详解
2017/05/05 Python
Python实现的直接插入排序算法示例
2018/04/29 Python
python图像处理模块Pillow的学习详解
2019/10/09 Python
如何理解python中数字列表
2020/05/29 Python
解决html5中video标签无法播放mp4问题的办法
2017/05/07 HTML / CSS
Canvas与图片压缩的示例代码
2017/11/28 HTML / CSS
巴西手表购物网站:eclock
2019/03/19 全球购物
Jar包的作用是什么
2014/03/30 面试题
介绍一下grep命令的使用
2015/06/12 面试题
酒吧员工的岗位职责
2013/11/26 职场文书
教学个人的自我评价分享
2014/02/16 职场文书
监察建议书范文
2014/03/12 职场文书
幼儿教师自我剖析材料
2014/09/29 职场文书
构建和谐校园倡议书
2015/01/19 职场文书
Python Pygame实战之塔防游戏的实现
2022/03/17 Python
python读取并查看npz/npy文件数据以及数据显示方法
2022/04/14 Python