我写了个程序来压缩网页,但是在FIREFOX中出现这样的错误:内容编码错误
无法显示您尝试查看的页面,因为它使用了无效或者不支持的压缩格式。源代码如下:
<?php
if(!extension_loaded('zlib')){
die("找到问题了!");
}
if (function_exists('ob_gzhandler')) {
ob_start('ob_gzhandler');
} else {
ob_start();
}
?>
//以下是HTML代码,没有全写出
<!DOCTYPE html><html><head><title>haha</title></head>
<body>hello哈哈哈</body></html>
<?php 
$content = ob_get_contents();
ob_end_clean();
echo $content;
?>google_ad_client = "ca-pub-5582534119917896";/* 728x90, 创建于 10-7-5 */google_ad_slot = "3201492376";google_ad_width = 728;google_ad_height = 90;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script></div></div><div id=danav></div><div class="nav bglv"><a href="http://www.dnbcw.info/">电脑编程网</a> -> <a href="http://biancheng.dnbcw.info/php/">php</a> -> 相关文章推荐:ob_start(),ob_start(''ob_gzhandler'')使用<a href="http://www.dnbcw.info/rss.php?id=5"><img src=http://www.dnbcw.info/images/rss.gif alt="订阅本分类信息" border="0" /></a></div><div class="db"><div id=content_da><script type="text/javascript"><!--google_ad_client = "ca-pub-5582534119917896";/* 300x250, 创建于 09-5-11 */google_ad_slot = "3847221247";google_ad_width = 300;google_ad_height = 250;//-->

解决方案 »

  1.   

    根据压缩原理我们知道,当文档中存在大量相同代码时,压缩率相对较高。
    我们在写html代码时,有大量的缩进、空格、代码相同的表格数据。所以HTML的压缩率一般都比较高。
    经过压缩后的代码传到浏览器后都能被现代流行的浏览器正确解析,我们查看源代码时依旧能看到整齐的代码。
    只是在输出到浏览器的网络传输上,原来20K的内容被压缩至2K传送,大大提高了网页的响应速度。
    压缩PHP输出代码的好处显而易见。但也存在一定的弊端,这就是在处理输出时进行了压缩会占用一定的服务器资源。及在客户端显示时会浏览器解压也会占用一定的客户端资源。
    slawdan (2008-11-15 11:24:57)还要在http头里告诉客户端你用了gzip编码呃~否则会乱码
    xiaojie515 (2008-11-15 11:25:36)在项目中有用到...
    七月十五 (2008-11-15 12:47:29)GZIP(GNU-ZIP)是一种压缩技术。经过GZIP压缩后页面大小可以变为原来的30%甚至更小。这样用户浏览的时候就会感觉很爽很愉快!
    要实现GZIP压缩页面需要浏览器和服务器共同支持,实际上就是服务器压缩,传到浏览器后浏览器解压并解析。浏览器那边不需要我们担心,因为现在绝大多数浏览器都支持解析GZIP过的页面。我们只要把页面在服务器端压缩再输出到浏览器就行了。有点罗嗦,下面说正事:正如要制作压缩饼干,先要拿到原料,要压缩一个页面,首先要获得要输出的内容。PHP中的ob_start()(ob => output buffer)函数可以实现这个功能,它可以把程序里准备输出的内容先放到一个叫做“缓冲区”的地方,当然,你可以理解为制作压缩饼干的暂时放原料的工作台。
    这个函数一定要在页面输出之前使用,所以一般把它放在代码的最顶端。因为它就像是一个工作台,所以你要在原料到来之前就要准备好它,否则原料来了没地方放,会出问题的。用ob_start()得到要压缩的页面之后,我们就可以制作压缩饼干了,不对,应该是可以压缩页面了!不过好像还缺少一台压缩机, EZ,我们用PHP带的zlib扩展做一台:[php]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; //返回压缩的内容,或者说把压缩好的饼干送回工作台。
    }
    [/php]压缩机做好了之后,我们把压缩机放到工作台上,于是原来的ob_start()变成ob_start('ob_gzip'); //没错,就是给ob_start()加一个参数,参数名就是我们刚才做的“压缩机”的函数名。这样当内容进入缓冲区后PHP就会调用ob_gzip函数把它压缩了。
    好了,所有的工作已完成,最后交货:ob_end_flush(); //结束缓冲区,输出内容。当然,不用这个函数也行,因为程序执行到最后会自动将缓冲区内容输出。
    完整的示例如下:[php]<?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;
    }
    ?>[/php]
    经过实际测试,上面代码中如果不用GZIP,是4.69KB=4802.56B,启用GZIP后缩小为104B ,呃……我数学可能不好,自己算下压缩到了原来的百分之多少吧。。另外,下面是用FlashGet获取的日志信息,可以看到我们程序里加的header信息:
    QUOTE: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
    小鱼哥哥 (2008-11-15 13:15:44)有的服务器不支持
    项目中建议设置一个选项
    自行选择是否开启
    zqy2453 (2008-12-13 15:39:22)这么好的东西怎么都没人来顶呀!!
    7347518 (2008-12-13 15:44:05)好文章,顶一个
    不过我开发的是手站,大多数的手机都不支持~~
    xdevil (2008-12-13 15:45:38)绝对要收藏。
    sinopf (2008-12-13 17:14:38)好文章,收藏了!
    xdevil (2008-12-13 19:41:05)为什么我的不行呢。
    应该是!headers_sent() 为0.去掉这个应该可以但乱码了。
    页面要怎么设置才可以的?
    zqy2453 (2008-12-15 09:17:08)hander("content-type:text/html; charset='utf=-8'");
    设置下编码应该是就不会乱了
    李惟 (2008-12-31 16:17:04)我很想知道怎样知道我gzip压缩后的大小。因为我使用了上面例子后将输出到IE页面的内容下载成HTML还是4K
    chenchenga (2009-12-14 14:18:34)很好的东西 但是 我的为什么乱码了 斑竹 出来解答下。。为什么乱码呢
    chenchenga (2009-12-14 14:24:55)PHP代码如下:
    <?php
    //启用一个带有ob_gzip压缩机的工作台
    ob_start('ob_gzip');
    //准备一些待压缩的内容
    for($i=0; $i<100; $i++)
    {
        echo('这里是压缩饼干的原料,这里是压缩饼干的原料,原料<br>');
    }
    //输出压缩成果
    ob_end_flush();
    //这是ob_gzip压缩机
    function ob_gzip($content)
    {    
        if(    !headers_sent() && extension_loaded("zlib") && strstr( $_SERVER["HTTP_ACCEPT_ENCODING"], "gzip")){
            $content = gzdeflate($content." \n//此页已压缩",9);
            header("Content-Encoding: gzip");
            header("Vary: Accept-Encoding");
            header("Content-Length: ".strlen($content));
        }
        return ($content) ;
    }
    ?>