PHP开启gzip页面压缩实例代码


Posted in PHP onMarch 11, 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 
if(Extension_Loaded('zlib')) Ob_Start('ob_gzhandler'); 
Header("Content-type: text/html"); 
?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> 
<title>无标题文档</title> 
</head> 
<body> 
<?php 
for($i=0;$i<10000;$i++){ 
echo 'Hello World!'; 
} 
?> 
</body> 
</html> 
<?PHP 
if(Extension_Loaded('zlib')) Ob_End_Flush(); 
?>

示例二(自写函数):
<?php ob_start('ob_gzip'); ?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> 
<title>无标题文档</title> 
</head> 
<body> 
</body> 
</html> 
<?php 
ob_end_flush(); 
//压缩函数 
function ob_gzip($content){ 
if(!headers_sent()&&extension_loaded("zlib")&&strstr($_SERVER["HTTP_ACCEPT_ENCODING"],"gzip")){ 
$content = gzencode($content,9); 
header("Content-Encoding: gzip"); 
header("Vary: Accept-Encoding"); 
header("Content-Length: ".strlen($content)); 
} 
return $content; 
} 
?>
PHP 相关文章推荐
PHP4与PHP3中一个不兼容问题的解决方法
Oct 09 PHP
php5新改动之短标记启用方法
Sep 11 PHP
php中取得URL的根域名的代码
Mar 23 PHP
2个自定义的PHP in_array 函数,解决大量数据判断in_array的效率问题
Apr 08 PHP
从wamp到xampp的升级之路
Apr 08 PHP
php实现转换ubb代码的方法
Jun 18 PHP
PHP的关于变量和日期处理的一些面试题目整理
Aug 10 PHP
PHP实现的通过参数生成MYSQL语句类完整实例
Apr 11 PHP
Zend Framework框架实现类似Google搜索分页效果
Nov 25 PHP
PHP 配置后台登录以及模板引入
Jan 24 PHP
详谈PHP中的密码安全性Password Hashing
Feb 04 PHP
PHP使用Redis替代文件存储Session的方法
Feb 15 PHP
php checkdate、getdate等日期时间函数操作详解
Mar 11 #PHP
PHP 5.3新特性命名空间规则解析及高级功能
Mar 11 #PHP
PHP Memcached + APC + 文件缓存封装实现代码
Mar 11 #PHP
了解Joomla 这款来自国外的php网站管理系统
Mar 11 #PHP
PHP调用Twitter的RSS的实现代码
Mar 10 #PHP
PHP中include()与require()的区别说明
Mar 10 #PHP
PHP扩展编写点滴 技巧收集
Mar 09 #PHP
You might like
php中cookie实现二级域名可访问操作的方法
2014/11/11 PHP
PHP获取QQ达人QQ信息的方法
2015/03/05 PHP
PHP如何将log信息写入服务器中的log文件
2015/07/29 PHP
php删除二维数组中的重复值方法
2018/03/12 PHP
$()JS小技巧
2007/07/21 Javascript
javascript实现div浮动在网页最顶上并带关闭按钮效果实例
2013/08/13 Javascript
javascript右下角弹层及自动隐藏(自己编写)
2013/11/20 Javascript
深入浅析JavaScript中的constructor
2016/04/19 Javascript
原生js的数组除重复简单实例
2016/05/24 Javascript
Bootstrap表单Form全面解析
2016/06/13 Javascript
详解vue2.0组件通信各种情况总结与实例分析
2017/03/22 Javascript
JavaScript获取tr td 的三种方式全面总结(推荐)
2017/08/15 Javascript
js根据需要计算数组中重复出现某个元素的个数
2019/01/18 Javascript
ES5和ES6中类的区别总结
2020/12/21 Javascript
python读取浮点数和读取文本文件示例
2014/05/06 Python
Python标准库sched模块使用指南
2017/07/06 Python
python 求1-100之间的奇数或者偶数之和的实例
2019/06/11 Python
Python的matplotlib绘图如何修改背景颜色的实现
2019/07/16 Python
django创建简单的页面响应实例教程
2019/09/06 Python
vue常用指令代码实例总结
2020/03/16 Python
Python-openCV开运算实例
2020/07/05 Python
详解pytorch tensor和ndarray转换相关总结
2020/09/03 Python
Python如何实现机器人聊天
2020/09/10 Python
python中pow函数用法及功能说明
2020/12/04 Python
Opodo英国旅游网站:预订廉价航班、酒店和汽车租赁
2018/07/14 全球购物
同学会邀请书大全
2014/01/12 职场文书
文明青少年标兵事迹材料
2014/01/28 职场文书
药剂专业自荐信范文
2014/04/16 职场文书
教师廉洁自律承诺书
2014/05/26 职场文书
乡党委干部党的群众路线教育实践活动个人对照检查材料思想汇报
2014/10/01 职场文书
环保建议书作文500字
2015/09/14 职场文书
查看nginx配置文件路径和资源文件路径的方法
2021/03/31 Servers
python-for x in range的用法(注意要点、细节)
2021/05/10 Python
python-opencv 中值滤波{cv2.medianBlur(src, ksize)}的用法
2021/06/05 Python
CSS 伪元素::marker详解
2021/06/26 HTML / CSS
俄罗斯十大城市人口排名,第三首都仅排第六,第二是北方首都
2022/03/20 杂记