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个人网站架设连环讲(二)
Oct 09 PHP
用PHP和ACCESS写聊天室(八)
Oct 09 PHP
如何写php程序?
Dec 08 PHP
PHP中文件缓存转内存缓存的方法
Dec 06 PHP
php开发留言板的CRUD(增,删,改,查)操作
Apr 19 PHP
php获取网页请求状态程序示例
Jun 17 PHP
PHP使用JSON和将json还原成数组
Feb 12 PHP
基于命令行执行带参数的php脚本并取得参数的方法
Jan 25 PHP
PHP分页初探 一个最简单的PHP分页代码的简单实现
Jun 21 PHP
PHP读取文件的常见几种方法
Nov 03 PHP
php 一维数组的循环遍历实现代码
Apr 10 PHP
实例解析php的数据类型
Oct 24 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
电脑硬件及电脑配置知识大全
2020/03/17 数码科技
php 求质素(素数) 的实现代码
2011/04/12 PHP
php自定义函数实现JS的escape的方法示例
2016/07/07 PHP
PHP图片添加水印功能示例小结
2016/10/03 PHP
jQuery怎么解析Json字符串(Json格式/Json对象)
2013/08/09 Javascript
js实现瀑布流的一种简单方法实例分享
2013/11/04 Javascript
分享28款免费实用的 JQuery 图片和内容滑块插件
2014/12/15 Javascript
浅析javascript 定时器
2014/12/23 Javascript
JQuery自动触发事件的方法
2015/06/13 Javascript
jQuery 中ajax异步调用的四种方式
2016/06/28 Javascript
BootStrap glyphicon图标无法显示的解决方法
2016/09/06 Javascript
基于SpringMVC+Bootstrap+DataTables实现表格服务端分页、模糊查询
2016/10/30 Javascript
原生JS实现获取及修改CSS样式的方法
2018/09/04 Javascript
JavaScript实现五子棋游戏的方法详解
2019/07/08 Javascript
Vue数据双向绑定底层实现原理
2019/11/22 Javascript
js实现验证码干扰(静态)
2021/02/22 Javascript
[15:58]DOTA2国际邀请赛采访专栏:Tongfu.Sansheng&KingJ,DK.rOtk
2013/08/08 DOTA
[39:53]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第一场 11.19
2020/11/19 DOTA
Python的Scrapy爬虫框架简单学习笔记
2016/01/20 Python
Python实现快速排序和插入排序算法及自定义排序的示例
2016/02/16 Python
Python的Django应用程序解决AJAX跨域访问问题的方法
2016/05/31 Python
python制作爬虫爬取京东商品评论教程
2016/12/16 Python
Python字典操作详细介绍及字典内建方法分享
2018/01/04 Python
selenium跳过webdriver检测并模拟登录淘宝
2019/06/12 Python
python算法与数据结构之冒泡排序实例详解
2019/06/22 Python
python实现12306登录并保存cookie的方法示例
2019/12/17 Python
python中温度单位转换的实例方法
2020/12/27 Python
Pytorch如何切换 cpu和gpu的使用详解
2021/03/01 Python
甜点店创业计划书
2014/01/27 职场文书
科技开发中心办公室主任岗位责任制
2014/02/10 职场文书
爱国卫生月实施方案
2014/02/21 职场文书
政风行风建设责任书
2014/07/23 职场文书
励志广播稿300字(5篇)
2014/09/15 职场文书
英语专业毕业论文答辩开场白
2015/05/27 职场文书
2016中秋晚会开幕词
2016/03/03 职场文书
pytorch finetuning 自己的图片进行训练操作
2021/06/05 Python