php中的GZIP(GNU-ZIP)是一种压缩技术。经过GZIP压缩后页面大小可以变为原来的30%甚至更小。这样用户浏览的时候就会感觉很快。
要实现GZIP压缩页面需要浏览器和 服务器共同支持,实际上就是服务器压缩,传到浏览器后浏览器解压并解析。浏览器那边不需要我们担心,因为现在绝大多数浏览器都支持解析GZIP过的页面。我们只要把页面在服务器端压缩再输出到浏览器就行了。
经过实际测试,用firebug可以看到
要实现GZIP压缩页面需要浏览器和 服务器共同支持,实际上就是服务器压缩,传到浏览器后浏览器解压并解析。浏览器那边不需要我们担心,因为现在绝大多数浏览器都支持解析GZIP过的页面。我们只要把页面在服务器端压缩再输出到浏览器就行了。
要压缩一个页面,首先要获得要输出的内容。PHP中的ob_start()(ob => output buffer)函数可以实现这个功能,它可以把程序里准备输出的内容先放到一个叫做“缓冲区”的地方。这个函数一定要在页面输出之前使用,所以一般把它放在代码的最顶端。
方法一
用PHP内置方法
<?php
if(Extension_Loaded('zlib')) Ob_Start('ob_gzhandler');
Header("Content-type: text/html; charset=utf-8");
//准备一些待压缩的内容
for($i=0; $i< 100; $i++) {
echo('测试: 需要压缩的内容');
}
if(Extension_Loaded('zlib')) Ob_End_Flush();
?>
方法二
用自写方法实现gzip压缩
/**
* 压缩输出方法 gzip压缩函数
* @param $content mixed 要压缩的页面内容
*/
function ob_gzip($content)
{
if(!headers_sent() && // 如果页面头部信息还没有输出
extension_loaded("zlib") && // 而且zlib扩展已经加载到PHP中
strstr($_SERVER["HTTP_ACCEPT_ENCODING"], "gzip")){ //而且浏览器说它可以接受GZIP的页面
//为准备压缩的内容贴上"此页已压缩"的注释标签,然后用zlib提供的gzencode()函数执行级别为9的压缩,这个参数值范围是0-9,0表示无压缩,9表示最大压缩,当然压缩程度越高越费CPU.
$content = gzencode($content." 此页已压缩", 9);
//然后用header()函数给浏览器发送一些头部信息,告诉浏览器这个页面已经用GZIP压缩过了!
header("Content-Encoding: gzip");
header("Vary: Accept-Encoding");
header("Content-Length: ".strlen($content));
}
return $content; //返回压缩的内容
}
调用方法:
给ob_start方法传入
ob_gzip作为callback参数,这样当内容进入缓冲区后PHP就会调用ob_gzip函数把它压缩了,然后用ob_end_flush()方法刷新缓冲区,输出内容
<?php
//启用一个带有ob_gzip压缩机的工作台
ob_start('ob_gzip');
//准备一些待压缩的内容
for($i=0; $i< 100; $i++) {
echo('测试: 需要压缩的内容');
}
//输出压缩成果
ob_end_flush();
/**
* 压缩输出方法 gzip压缩函数
* @param $content mixed 要压缩的页面内容
*/
function ob_gzip($content)
{
if(!headers_sent() && // 如果页面头部信息还没有输出
extension_loaded("zlib") && // 而且zlib扩展已经加载到PHP中
strstr($_SERVER["HTTP_ACCEPT_ENCODING"], "gzip")){ //而且浏览器说它可以接受GZIP的页面
//为准备压缩的内容贴上"此页已压缩"的注释标签,然后用zlib提供的gzencode()函数执行级别为9的压缩,这个参数值范围是0-9,0表示无压缩,9表示最大压缩,当然压缩程度越高越费CPU.
$content = gzencode($content." 此页已压缩", 9);
//然后用header()函数给浏览器发送一些头部信息,告诉浏览器这个页面已经用GZIP压缩过了!
header("Content-Encoding: gzip");
header("Vary: Accept-Encoding");
header("Content-Length: ".strlen($content));
}
return $content; //返回压缩的内容
}
?>
经过实际测试,用firebug可以看到
如果不启用GZIP需要传输2.8KB=2900
B的数据
启用GZIP后缩小为83B
原文地址:http://linux.chinaitlab.com/PHP/902486.html