要实现 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(); // 结束缓冲区, 输出内容当然, 不用这个函数也行, 因为程序执行到最后会自动将缓冲区内容输出
完整的示例如下:
代码如下:
- // 启用一个带有 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 的内置压缩函数):
代码如下:
- if(Extension_Loaded('zlib')) Ob_Start('ob_gzhandler');
- Header("Content-type: text/html");
- ?>
- for($i=0;$i<10000;$i++){
- echo 'Hello World!';
- }
- ?>
- if(Extension_Loaded('zlib')) Ob_End_Flush();
- ?>
示例二 (自写函数):
代码如下:
- 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;
- }
- ?>
来源: https://www.php1.cn/detail/php-ba005bffa3.html