PHP使用zlib实现页面的gzip压缩输出

21 篇文章 0 订阅
5 篇文章 0 订阅
php中的GZIP(GNU-ZIP)是一种压缩技术。经过GZIP压缩后页面大小可以变为原来的30%甚至更小。这样用户浏览的时候就会感觉很快。
   
    要实现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=2900B的数据

启用GZIP后缩小为83B


原文地址:http://linux.chinaitlab.com/PHP/902486.html




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值