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 相关文章推荐
php数组去重实例及分析
Nov 26 PHP
php判断是否为json格式的方法
Mar 04 PHP
一个经典的PHP文件上传类分享
Nov 18 PHP
PHP学习笔记(二):变量详解
Apr 17 PHP
PHP版QQ互联OAuth示例代码分享
Jul 05 PHP
php模拟post上传图片实现代码
Jun 24 PHP
利用PHP生成CSV文件简单示例
Dec 21 PHP
PHP实现的简单sha1加密功能示例
Aug 27 PHP
Laravel如何使用Redis共享Session
Feb 23 PHP
PHP7如何开启Opcode打造强悍性能详解
May 11 PHP
php 读取文件夹下所有图片、文件的实例
Oct 17 PHP
php计数排序算法的实现代码(附四个实例代码)
Mar 31 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函数实现从一个文本字符串中提取关键字的方法
2015/07/01 PHP
CentOS下PHP7的编译安装及MySQL的支持和一些常见问题的解决办法
2015/12/17 PHP
Laravel 5.3 学习笔记之 配置
2016/08/28 PHP
PHP SPL 被遗落的宝石【SPL应用浅析】
2018/04/20 PHP
PHP语言对接抖音快手小红书视频/图片去水印API接口源码
2020/08/11 PHP
PHP后门隐藏的一些技巧总结
2020/11/04 PHP
在chrome浏览器中,防止input[text]和textarea在聚焦时出现黄色边框的解决方法
2011/05/24 Javascript
工作需要写的一个js拖拽组件
2011/07/28 Javascript
js选取多个或单个元素的实现代码(用class)
2012/08/22 Javascript
JS检测图片大小的实例
2013/08/21 Javascript
javascript手工制作悬浮菜单
2015/02/12 Javascript
jQuery控制cookie过期时间的方法
2015/04/07 Javascript
JavaScript类继承及实例化的方法
2015/07/25 Javascript
jQuery实现的产品自动360度旋转展示特效源码分享
2015/08/21 Javascript
Bootstrap零基础入门教程(二)
2016/07/18 Javascript
jquery轮播的实现方式 附完整实例
2016/07/28 Javascript
vue主动刷新页面及列表数据删除后的刷新实例
2018/09/16 Javascript
jQuery 选择器用法实例分析【prev + next】
2020/05/22 jQuery
使用webpack和rollup打包组件库的方法
2021/02/25 Javascript
[03:17]2014DOTA2 国际邀请赛中国区预选赛 四强专访
2014/05/23 DOTA
[56:35]DOTA2上海特级锦标赛C组小组赛#1 OG VS Archon第二局
2016/02/27 DOTA
python 读写文件,按行修改文件的方法
2018/07/12 Python
Python 使用 docopt 解析json参数文件过程讲解
2019/08/13 Python
MATLAB数学建模之画图汇总
2020/07/16 Python
HTML5表单验证特性(知识点小结)
2020/03/10 HTML / CSS
澳大利亚最大的护发和护肤品购物网站:RY
2019/12/26 全球购物
类成员函数的重载、覆盖和隐藏区别
2016/01/27 面试题
药学专业毕业生求职信
2013/10/20 职场文书
汽车专业学生自我评价
2014/01/19 职场文书
企业财务人员岗位职责
2015/04/14 职场文书
张丽莉观后感
2015/06/16 职场文书
班级联欢会主持词
2015/07/03 职场文书
2015年新教师个人工作总结
2015/10/14 职场文书
一看就懂的MySQL的聚簇索引及聚簇索引是如何长高的
2021/05/25 MySQL
详解Python函数print用法
2021/06/18 Python
tp5使用layui实现多个图片上传(带附件选择)的方法实例
2021/11/17 PHP