mod_gzip是一个Apache模块,其功能是使用Gzip压缩静态的html页面,遵循IETF标准的浏览器可以接受gzip编码(IE, Netscape等)。mod_gzip可以将页面的下载时间提高4-5倍。我强烈建议你在你的web服务器上使用mod_gzip。然而,我们还必须用PHP建立我们自己的压缩引擎。在这篇文章里,我将要介绍如何使用PHP的输出控制函数来大幅加速页面载入速度。

介绍PHP的输出控制函数

PHP4中最令人满意的事是——你可以让PHP缓存所有由脚本生成的输出,在你决定把它们送出之前,浏览器方是不会收到任何内容的。在脚本程序中你能用这些函数来设置header、cookies,然而这只是强大的输出函数的一小部分功能。<?php

void ob_start(void);

?>

告诉PHP处理器把所有的输出重定向到一个内部的缓存(buffer)中。在调用ob_start之前,没有输出会被送到浏览器去。<?php

string ob_get_contents(void);

?>

该函数将“输出缓存”(output buffer)以字符串的形式返回。你可以调用该函数把积累下来的输出送到浏览器中。(仅在把buffering功能关闭之后!!)<?php

int ob_get_length(void);

?>

返回缓存中的字符串的长度。<?php

void ob_end_clean(void);

?>

清空输出缓存,并将输出缓存关闭。在缓存中的内容输出到浏览器之前,必须使用这个函数。

void 501([int flag])

用来打开/关闭隐含的flush动作开关(默认是关)。如果flush是开的,每次调用print/echo或是其它输出命令的时候,输出的内容会被立即送到浏览器端。

使用输出控制来压缩PHP输出

你必须使用PHP4里编译的Zlib扩展包来压缩输出。如果需要的话,可以查看PHP文档中有关Zlib包的安装指导。

首先,初始化输出缓存:<?php

ob_start();

ob_implicit_flush(0);

?>

之后,用print, echo, 或其他你喜欢的方法生成所有输出内容,例如:<?php

print("Hey this is a compressed output!");

?>

页面生成后,我们取回输出内容:<?php

$contents = ob_get_contents();

ob_end_clean();

?>

之后,必须检测浏览器是否支持压缩数据。如果支持,浏览器会发给服务器端一个ACCEPT-ENCODEING HTTP头。我们只需检查$HTTP_ACCEPT_ENCODING变量中是否有“gzip,deflate”字串。<?php

if(ereg('gzip, deflate',$HTTP_ACCEPT_ENCODING)) {

// 在这里生成 Gzip 压缩的内容

} else {

echo $contents;

}

?>

这种方法使用起来既简单又结构清晰。下面让我们看看如何生成压缩的输出:<?php

//告诉浏览器将要收到的是gzip数据

//当然在此之前,你已经检查了它们是否支持gzip,x-gzip数据格式

//如果支持的是x-gzip,那么下面的头就要用z-gzip来代替

header("Content-Encoding: gzip");

//显示gzip文件的头

//只需显示一次

echo "x1fx8bx08x00x00x00x00x00";

//计算出文件的大小和CRC码

$Size = strlen($contents);

$Crc = crc32($contents);

//压缩数据

$contents = gzcompress($contents, 9);

//我们不能就这样输出,因为CRC码是混乱的。

//如果我在这里使用“echo $contents”,压缩的数据会被送出,

//但是却不完整。文件最后的四个字节是CRC校验码,可是只发出去了三个字节。

//最后一个字节被丢掉了。我不知道这个bug在4.0.2版中解决了没有,

//不过最好避免错误的方法是把正确的CRC校验码加到压缩的数据的末尾。

//

//把旧的CRC校验码剥离

$contents = substr($contents, 0, strlen($contents) - 4);

//仅显示压缩的数据

echo $contents;

//输出CRC,和原来数据的大小(字节)

gzip_PrintFourChars($Crc);

gzip_PrintFourChars($Size);

function gzip_PrintFourChars($Val) {

for ($i = 0; $i <4; $i ++) {

echo chr($Val % 256);

$Val = floor($Val / 256);

}

}

?>

//好了,你还可以按此方式附加上更多的压缩数据。

要想进行实际的测试,所有的脚本代码如下:<?php

ob_start();

ob_implicit_flush(0);

print("I'm compressed!n");

$contents = ob_get_contents();

ob_end_clean();

header("Content-Encoding: gzip");

echo "x1fx8bx08x00x00x00x00x00";

$Size = strlen($contents);

$Crc = crc32($contents);

$contents = gzcompress($contents, 9);

$contents = substr($contents, 0, strlen($contents) - 4);

echo $contents;

gzip_PrintFourChars($Crc);

gzip_PrintFourChars($Size);

function gzip_PrintFourChars($Val) {

for ($i = 0; $i <4; $i ++) {

echo chr($Val % 256);

$Val = floor($Val / 256);

}

}

?>

缓存PHP输出

当PHP4还没问世,我不得不使用PHP3的时候,我对开发一些缓存机制来减少数据库的载入、对文件系统的存取十分感兴趣。在PHP3中没有什么特别好的方法,但是有了输出缓存之后,在PHP4中一切变得容易多了。

这有一个简单的例子:<?php

//为请求的URI构造一个文件名

$cached_file=md5($REQUEST_URI);

if((!file_exists("/cache/$cached_file"))||(!is_valid("/cache/$cached_file"))) {

//is_valid函数验证缓存,你可以用这个函数检查Cache是否过期或其他特定的条件。

//如果文件不在Cache中或者不可用则生成输出

ob_start();

ob_implicit_flush(0);

//在此输出……

$contents = ob_get_contents();

ob_end_clean();

$fil=fopen($cached_file,"w+");

fwrite($fil,$contents,$strlen($contents));

fclose($fil);

}

/如果请求的文件在缓存中且可用,则:

readfile($cached_file);

?>

这是一个简单的例子,使用输出缓存,你可以建立一个复杂的内容生成系统,对不同的块或程序使用不同的缓存机制,等等……

结论

PHP输出控制函数对把脚本生成的输出重定向到缓存中十分有用。为支持gzip的浏览器输出压过的缓存数据可以减少载入时间。也可作为缓存机制来减少对数据源的存取(数据库或文件),这对使用XML意义重大。

如果我们用PHP建立一个引擎,缓存从数据源得到的数据(xml文档和数据库),并且动态的生成XML格式的内容(没有外观-presentation)我们可以得到这些XML的输出,并使用XSLT转换成任意一种我们想要的外观格式(html, wap, palm, pdf等)。使用PHP4的输出缓存和Sablotron XSLT扩展可以很好地完成这个任务。

php动态页面如何缓存,php缓存并压缩动态页面的技巧详解相关推荐

  1. ARP缓存表的构成ARP协议全面实战协议详解、攻击与防御

    ARP缓存表的构成ARP协议全面实战协议详解.攻击与防御 1.4.3  ARP缓存表的构成 在局域网的任何一台主机中,都有一个ARP缓存表.该缓存表中保存中多个ARP条目.每个ARP条目都是由一个IP ...

  2. 动态代理——拦截器——责任链——AOP面向切面编程底层原理详解(迪丽热巴版)

    目录 动态代理模式详解 前言 什么是代理模式 如何进行代理 静态代理 动态代理 JDK动态代理 CGLIB动态代理 拦截器 责任链模式 博客文章版权申明 动态代理模式详解 前言 代理模式是设计模式中非 ...

  3. android缓存的后台进程,Android应用程序进程生命周期详解

    第一:前台进程 这样的进程拥有一个在屏幕上显示并且和用户交互的Activity,或者它的一个IntentReciver正在运行.这样的进程等级最高,系统不会主动去销毁它.除非达到万不得已的情况,比如内 ...

  4. 【C语言】数据存储分类(动态、静态存储)、作用域(全局变量、局部变量)详解--(已配图,更方便理解)

    目录 1.变量分类(引入存储类别) 1)存在时间看动态存储还是静态存储 2)作用域:局部变量和全局变量 1.变量分类(引入存储类别) 变量和函数都有两个属性:数据类型和数据存储类别(auto自动.st ...

  5. android 动态波纹效果,Android实用View------水波动画效果多种实现方式详解

    这次给大家带来的是一篇关于自定义View实现水波动画效果的文章,其实在去年项目中使用过类似的动画,当时就自定义View也实现了预期的效果,最近项目中又使用了相似的效果,于是对代码重新整理了一下并且记录 ...

  6. 动态路由协议的分类、动静态路由优缺点、RIP简介、组播单播广播详解(附图)

    目录 一.动态路由协议的分类 (1)按照工作区域范围: (2)按照路由算法: RIP相关知识简介: 二.静态路由优缺点: 三. 动态路由优缺点: 四.单播.组播.广播详解: 一.动态路由协议的分类 ( ...

  7. 【转】系统缓存全解析二:动态缓存(2)-页面局部缓存的两种方式

    有时缓存整个页面是不现实的,因为页的某些部分可能在每次请求时都需要变化.在这些情况下,只能缓存页的一部分.顾名思义,页面部分缓存是将页面部分内容保存在内存中以便响应用户请求,而页面其他部分内容则为动态 ...

  8. php缓存输出压缩,PHP控制输出:缓存并压缩动态页面的简单示例

    这篇文章主要为大家详细介绍了PHP控制输出:缓存并压缩动态页面的简单示例,具有一定的参考价值,可以用来参考一下. 感兴趣的小伙伴,下面一起跟随512笔记的小玲来看看吧! mod_gzip是一个Apac ...

  9. php缓存输出压缩,PHP_控制PHP的输出:缓存并压缩动态页面,mod_gzip是一个Apache模块,其功 - phpStudy...

    控制PHP的输出:缓存并压缩动态页面 mod_gzip是一个Apache模块,其功能是使用Gzip压缩静态的html页面,遵循IETF标准的浏览器可以接受gzip编码(IE, Netscape等).m ...

最新文章

  1. 回顾以前的线程安全的类
  2. 【深度学习】基于Pytorch的线性模型概念辨析和实现(二)
  3. ASP.Net网站文件类型大全
  4. WINCE串口WriteFile阻塞问题解决方法
  5. 5、【设计模式】单列模式
  6. 动人配乐是如何炼成的?带您了解《花之灵》背景原声的幕后制作秘辛
  7. datatable删除csv中的一列
  8. 思维导图下载 注册安全_【思维导图】初中各科思维导图,涵盖3年各科所有知识点,可下载打印!...
  9. leecode62 不同路径
  10. 【机器学习】图片中的人脸识别
  11. php将数组值用 分开,PHP将数组分成基于相等值的组
  12. Android视频录制从不入门到入门系列教程(一)————简介
  13. SDUT_2012省赛选拔赛2 部分题目
  14. python基础:变量与数据类型
  15. Python中如何安装pip,xlrd
  16. Oracle分析函数
  17. eclipse安装中文版插件
  18. 萤石云摄像头方向操控前端代码
  19. JS中反射Reflect的基本使用
  20. 亚马逊仓库部署机器人:每小时挑拣物品为过去三倍

热门文章

  1. IntelliJ IDEA 恢复出厂设置
  2. vim代码对齐命令_vim让代码整齐美观的小技巧
  3. df100(df1001tx)
  4. linux常用脚本的使用方法,Linux常用命令用法100个
  5. 公积金提取 -- 小黑日常超详细教程
  6. 深度学习快速上手建议
  7. Camera HAL 参数传递流程 ---- 以ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION为例追踪
  8. Unity3D学习视频
  9. vue发起微信或支付宝支付
  10. Opencv9:实现图像尺寸缩减(降采样)功能