经过GZIP压缩后页面大小可以变为原来的30%甚至更小。要实现GZIP压缩页面需要浏览器和服务器共同支持,

实际上就是服务器压缩,传到浏览器后浏览器解压并解析。浏览器那边不需要我们担心,因为现在绝大多数浏览器都支持解析GZIP过的页面。我们只要把页面在服务器端压缩再输出到浏览器就行了。

1  正如要制作压缩饼干,先要拿到原料,要压缩一个页面,首先要获得要输出的内容。PHP中的ob_start()(ob => output buffer)函数可以实现这个功能,它可以把程序里准备输出的内容先放到一个叫做“缓冲区”的地方,当然,你可以理解为制作压缩饼干的暂时放原料的工作 台。

2   这个函数一定要在页面输出之前使用,所以一般把它放在代码的最顶端。因为它就像是一个工作台,所以你要在原料到来之前就要准备好它,否则原料来了没地方放,会出问题的。用ob_start()得到要压缩的页面之后,可以压缩页面了  不过好像还缺少一台压缩机,我们用PHP带的zlib扩展做一台

3  
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函数把它压缩了。
好了,所有的工作已完成,最后交货:

  1. ob_end_flush(); //结束缓冲区,输出内容。当然,不用这个函数也行,因为程序执行到最后会自动将缓冲区内容输出。

//完整的示例如下:

    1. <?php
    2. //启用一个带有ob_gzip压缩机的工作台
    3. ob_start('ob_gzip');
    4. //准备一些待压缩的内容
    5. for($i=0; $i<100; $i++)
    6. {
    7. echo('这里是压缩饼干的原料,这里是压缩饼干的原料,原料');
    8. }
    9. //输出压缩成果
    10. ob_end_flush();
    11. //这是ob_gzip压缩机
    12. function ob_gzip($content)
    13. {
    14. if(        !headers_sent() &&
    15. extension_loaded("zlib") &&
    16. strstr($_SERVER["HTTP_ACCEPT_ENCODING"],"gzip"))
    17. {
    18. $content = gzencode($content." \n//此页已压缩",9);
    19. header("Content-Encoding: gzip");
    20. header("Vary: Accept-Encoding");
    21. header("Content-Length: ".strlen($content));
    22. }
    23. return $content;
    24. }
    25. ?>

gzip1的更多相关文章

  1. 从头开始构建LINUX [LFS 脚本]

    脚本共享在这 http://pan.baidu.com/s/1nt6yiH7 version-check.sh : 这个是检查HOST机器的软件依赖情况 host-dep.sh:针对ubuntu10_ ...

  2. centos 7.0 nginx 1.7.9成功安装过程

    centos 7.0根目录 的目录构成 [root@localhost /]# lsbin dev home lib64 mnt proc run srv tmp varboot etc lib me ...

  3. centos 7.0 查看所有安装的包

    rpm方式安装的包 默认 最小化安装centos 7.0 rpm -qa 查看所有安装的包 [root@localhost ~]# rpm -qa biosdevname-0.5.0-10.el7.x ...

  4. Linux就这个范儿 第16章 谁都可以从头再来--从头开始编译一套Linux系统 nsswitch.conf配置文件

    Linux就这个范儿 第16章 谁都可以从头再来--从头开始编译一套Linux系统  nsswitch.conf配置文件 朋友们,今天我对你们说,在此时此刻,我们虽然遭受种种困难和挫折,我仍然有一个梦 ...

  5. LFS7.4编译笔记(2)

    上一篇我们已经搭建好了临时系统,这一篇我们就开始正式构建我们的最终LFS系统. 首先切换到root,准备虚拟内核文件系统并挂载: su - export LFS=/mnt/lfs mkdir -pv ...

  6. LFS7.4编译笔记(1)

    由于第一次编译,花了不少时间,也不知道能不能成功,所以就没有记笔记,现在重新编译一次,这次不装U盘而是装到我的移动硬盘上面.步骤差不多,因为我感觉硬盘的速度会比U盘快. 至于LFS的优点,我就不多说了 ...

  7. centos下卸载rpm包

    rpm -qa|grep sphinx rpm -e sphinx..... 安全地卸载 RPM卸载软件包,并不是简单地将原来安装的文件逐个删除,那样做的话,可能会出现这样或那样的问题.如,A软件包依 ...

  8. percona-xtrabackup安装及使用教程

    安装percona-xtrabackup依赖包(前提已安装mysql) yum -y install perl-CPAN perl-DBD-MySQL perl make gcc gcc-c++ pa ...

  9. LFS,编译自己的Linux系统 - 准备

    概述 现在用的操作系统是Win8.1,用VMware创建一个虚拟机,3G内存(物理内存是6G,分一半),23G硬盘,其中3G用于swap分区,10G用于host system,10G用于建立LFS系统 ...

随机推荐

  1. PI Square中文论坛: PI SDK 开发中级篇| PI Square

    注: 为了更好的利用站内资源营造一个更好的中文开发资源空间,本文为转发修正帖,原作者为OSIsoft技术工程师王曦(Xi Wang),原帖地址:PI SDK 中级篇 来源:https://d.gg36 ...

  2. WebGL和ThreeJs学习6--射线法确定3D空间中所选物体

    一.在 threejs 中如何确定下图3D空间中鼠标点击位置的 object 对象? 二.射线法确定步骤及代码 //Three.js提供一个射线类Raycaster来拾取场景里面的物体.更方便的使用鼠 ...

  3. 黄聪:AngularJS 动态加载控制器实例-ocLoazLazy

    一.AngularJS动态加载控制器和视图实例 路由配置关键代码: //二级页面 $stateProvider.state('main', { url: '/:name', /**如果需要动态加载数据 ...

  4. 模拟a标签click,弹出新页面

    $("<a>").attr("href", url).attr("target", "_blank")[0] ...

  5. bzoj5008: 方师傅的房子

    Description 方师傅来到了一个二维平面.他站在原点上,觉得这里风景不错,就建了一个房子.这个房子是n个点的凸多边形 ,原点一定严格在凸多边形内部.有m个人也到了这个二维平面.现在你得到了m个 ...

  6. PAT 乙级 1063 计算谱半径(20) C++版

    1063. 计算谱半径(20) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 在数学中,矩阵的“谱半径”是指其特 ...

  7. JVM异常之:栈溢出StackOverflowError

    在java虚拟机规范中,虚拟机栈和本地方法栈都会出现StackOverflowError和OutofMemoryError,程序计数器是java虚拟机中唯一一块不会产生error的内存区域. 一.St ...

  8. 开发框架-Web-Java:JeePlus

    ylbtech-开发框架-Web-Java:JeePlus 1.返回顶部   2.返回顶部   3.返回顶部   4.返回顶部   5.返回顶部 0. http://www.jeeplus.org/ ...

  9. php的语法

    常量:不变的量: php 设置常量的方法:define()方法: define("常量名","常量的值",true) 参数三:大小写是否敏感: php中的常量, ...

  10. Jmeter(十五)Logic Controllers 之 while Controller

    while Controller是控制循环的Controller,条件判断的Controller.先看看官方Demo. while Controller控制它的子对象,直到false为止.并且还提供了 ...