php实现页面GZIP压缩输出

php实现页面GZIP压缩输出:

GZIP(GNU-ZIP)是一种压缩技术。经过GZIP压缩后页面大小可以变为原来的30%甚至更小。这样用户浏览的时候就会感觉很爽很愉快!要实现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 OKFri Jan 25 17:53:10 2008 Server: Microsoft-IIS/5.1Fri Jan 25 17:53:10 2008 Date: Fri, 25 Jan 2008 09:53:10 GMTFri Jan 25 17:53:10 2008 Connection: closeFri Jan 25 17:53:10 2008 X-Powered-By: PHP/5.2.5Fri Jan 25 17:53:10 2008 Content-Encoding: gzipFri Jan 25 17:53:10 2008 Vary: Accept-EncodingFri Jan 25 17:53:10 2008 Content-Length: 104Fri Jan 25 17:53:10 2008 Content-type: text/html

九州天空城3d影传说副本怎么玩?影传说是游戏中的一个特色副本,通过后有很多奖励,那影传说副本怎么打?看到有些玩家不太了解,下面和小编一起来看看九州天空城3d影传说副本攻略吧!,九州天空城3d影传说副本怎么玩 九州天空城3d影传说副本攻略
2017-09-04
同城来宾app下载-同城来宾app是一款生活服务应用,同城来宾app为用户提供本地最新的新闻资讯、餐饮美食、娱乐购物等信息,让用户可以体验便捷舒适的生活服务,您可以免费下载安卓手机同城来宾。
2016-07-28
Skysonic app下载-Skysonic是一款音乐智能硬件控制类软件,平台为用户提供在线教学、线下体验等内容,快速实现消费者和商家的近距离接触,也为音乐人提供专业的音乐学习交流平台。,您可以免费下载安卓手机Skysonic。
2021-06-18
智慧南雄app下载-智慧南雄app是一款专门为南雄地区用户打造的生活服务软件,智慧南雄app是南雄城市综合管控系统在移动平台的客户端,主要包含应急指挥、减灾防灾、巡逻巡检、地图资源、视频监控查看等服务。,您可以免费下载安卓手机智慧南雄。
2020-07-23
筑医台app是一个医学方面的助手。医学资讯,医院建设都可以在这里进行,相关的医学活动也在这里,感兴趣的可以来下载。
2021-03-16
方舟健康app下载-方舟健康app是一款健康医疗应用,方舟健康app为用户提供专业的医疗咨询、治疗方案查询等功能,让专业的团队为用户的健康保驾护航,您可以免费下载安卓手机方舟健康。
2017-04-20
语文学习,为更多小伙伴们提供专业优质的语文学习培训服务,通过语文学习app小伙伴们可以随时随地高效系统的学习语文知识,更多语文app下载就来ACG饭圈~
2021-11-15
,IE新爆重大漏洞——毒霸全球首家提出解决方案
2004-10-08
万圣节的带来,光遇也更新了活动和任务,很多玩家都不知道光遇万圣节巫师在哪,小编就带来了一期光遇万圣节巫师位置一览攻略给大家,一起来看看吧。,光遇万圣节巫师在哪 光遇万圣节巫师位置一览
2021-10-29
爱威远app下载-爱威远app是一款专门为威远地区打造的生活服务类软件,爱威远app可以让用户通过应用获取威远本地的生活资讯,提供丰富的资讯分类,并且以多种媒体传播方式,您可以免费下载安卓手机爱威远。
2022-08-12