本以为,对于使用gzip压缩后传输的网页,本来应该只要发送一个http头 Accept-Encoding: identity或干脆不发送这个头等,即可使目标站返回未经gzip压缩的页面。
实际情况却是:目标站无视客户端的请求,仍然返回gzip数据,造成乱码。
因此,就需要考虑对gzip后的php文件进行解压了,用内置的gzdecode函数即可。
配置了半天也无法支持gzdecode函数,只好用如下的变通方式,实现了想要的功能:
/**
* php自定义gzdecode解压缩gzip文件
* edit www.
*/
if (!function_exists('gzdecode')) {
function gzdecode ($data) {
$flags = ord(substr($data, 3, 1));
$headerlen = 10;
$extralen = 0;
$filenamelen = 0;
if ($flags & 4) {
$extralen = unpack('v' ,substr($data, 10, 2));
$extralen = $extralen[1];
$headerlen += 2 + $extralen;
}
if ($flags & 8) // Filename
$headerlen = strpos($data, chr(0), $headerlen) + 1;
if ($flags & 16) // Comment
$headerlen = strpos($data, chr(0), $headerlen) + 1;
if ($flags & 2) // CRC at end of file
$headerlen += 2;
$unpacked = @gzinflate(substr($data, $headerlen));
if ($unpacked === FALSE)
$unpacked = $data;
return $unpacked;
}
}
?>
调用:
$f=@file_get_contents(http://www.);
echo gzdecode($f);
?>
在服务器中实现gzip压缩的方法有多种:
1,Nginx 的 GZIP 配置
2,Apache 的 mod_deflate.so 模块
3,各种 PHP 程序中通过 PHP自身 实现压缩。
不过,php本身就有2种实现方法,一种是开启zlib.output_compression,一种是 ob_gzhandler编码。
在默认情况下,zlib.output_compression是关闭的,如需开启需编辑php.ini文件,找到以下选项并开启:
zlib.output_compression_level = 6
完成后可以通过phpinfo()函数检测结果,当zlib.output_compression的Local Value和MasterValue的值同为On时,表示已经生效,这时候访问的PHP页面(包括伪静态页面)已经GZIP压缩了,通过Firebug或在线网页GZIP压缩检测工具检测到压缩的效果。
若需要使用ob_gzhandler(默认),则需关闭zlib.output_compression,把php.ini文件内容更改为:
zlib.output_compression_level = -1
说明:ob_gzhandler是多数程序(discuz,phpwind等)推荐的用法,建议大家采用哦。
我们知道,php主要通过ob_gzhandler内置函数进行gzip压缩输出。
那么,如何开启整站gzip压缩输出,可以通过php.ini配置文件,实现开启或关闭php gzip配置,以实现整站的压缩输出。
自php4.3开始zlib压缩,已内置在php中了,无需单独安装zlib。
如果只通过php.ini配置文件开启gzip配置实现php gzip压缩输出是不行的,还需要apache对其进行支持,所以建议使用apache服务器。
配置gzip步骤:
一、打开php.ini配置文件,找到zlib.output_compression = Off,将
zlib.output_compression = Off
;zlib.output_compression_level = -1
修改为:
zlib.output_compression = On
zlib.output_compression_level = 6
php gzip配置知识点:
1、默认php是不开启zlib整站压缩输出的,而是通过对需要压缩输出的页面使用ob_gzhandler函数实现,两者只能二选一,否则会报错。
2、zlib.output_compression默认值为Off,你可以将其设置为On.
3、zlib.output_compression_level代表压缩比,默认推荐设置压缩比值为6,可选范围为1-9,-1代表关闭php zlib(gzip)压缩
二、保存php.ini配置文件。
三、打开apache 配置文件httpd.conf,配置装载deflate_module
必须让apache装载deflate_module:
找到deflate_module
#LoadModule deflate_module modules/mod_deflate.so
去除开头的#号,并重启apache即可。