控制PHP的输出:缓存并压缩动态页面
mod_gzip是一个Apache模块,其功能是使用Gzip压缩静态的html页面,遵循IETF标准的浏览器可以接受gzip编码(IE,Netscape等)。mod_gzip可以将页面的下载时间提高4-5倍。我强烈建议你在你的web服务器上使用mod_gzip。然而,我们还必须用PHP建立我们自己的压缩引擎。在这篇文章里,我将要介绍如何使用PHP的输出控制函数来大幅加速页面载入速度。 介绍PHP的输出控制函数 PHP4中最令人满意的事是——你可以让PHP缓存所有由脚本生成的输出,在你决定把它们送出之前,浏览器方是不会收到任何内容的。在脚本程序中你能用这些函数来设置header、cookies,然而这只是强大的输出函数的一小部分功能。 代码如下: void ob_start(void);
?> 告诉PHP处理器把所有的输出重定向到一个内部的缓存(buffer)中。在调用ob_start之前,没有输出会被送到浏览器去。 代码如下: string ob_get_contents(void);
?> 该函数将“输出缓存”(output buffer)以字符串的形式返回。你可以调用该函数把积累下来的输出送到浏览器中。(仅在把buffering功能关闭之后!!) 代码如下: int ob_get_length(void);
?> 返回缓存中的字符串的长度。 代码如下: void ob_end_clean(void);
?> 清空输出缓存,并将输出缓存关闭。在缓存中的内容输出到浏览器之前,必须使用这个函数。 使用输出控制来压缩PHP输出 代码如下: ob_start();
ob_implicit_flush(0); ?> 之后,用print,echo,或其他你喜欢的方法生成所有输出内容,例如: 代码如下: print("Hey this is a compressed output!");
?> 页面生成后,我们取回输出内容: 代码如下: $contents = ob_get_contents();
ob_end_clean(); ?> 之后,必须检测浏览器是否支持压缩数据。如果支持,浏览器会发给服务器端一个ACCEPT-ENCODEING HTTP头。我们只需检查$HTTP_ACCEPT_ENCODING变量中是否有“gzip,deflate”字串。 代码如下: if(ereg('gzip,deflate',$HTTP_ACCEPT_ENCODING)) {
// 在这里生成 Gzip 压缩的内容 } else { echo $contents; } ?> 这种方法使用起来既简单又结构清晰。下面让我们看看如何生成压缩的输出: 代码如下: //告诉浏览器将要收到的是gzip数据
//当然在此之前,你已经检查了它们是否支持gzip,x-gzip数据格式 //如果支持的是x-gzip,那么下面的头就要用z-gzip来代替 header("Content-Encoding: gzip"); //显示gzip文件的头 //计算出文件的大小和CRC码 //压缩数据 //我们不能就这样输出,因为CRC码是混乱的。 //仅显示压缩的数据 //输出CRC,和原来数据的大小(字节) function gzip_PrintFourChars($Val) { ?> 要想进行实际的测试,所有的脚本代码如下: 代码如下: ob_start();
ob_implicit_flush(0); print("I'm compressed!n"); $contents = ob_get_contents(); header("Content-Encoding: gzip"); echo "x1fx8bx08x00x00x00x00x00"; $Size = strlen($contents); $contents = gzcompress($contents,9); $contents = substr($contents,strlen($contents) - 4); echo $contents; gzip_PrintFourChars($Crc); function gzip_PrintFourChars($Val) { 缓存PHP输出 当PHP4还没问世,我不得不使用PHP3的时候,我对开发一些缓存机制来减少数据库的载入、对文件系统的存取十分感兴趣。在PHP3中没有什么特别好的方法,但是有了输出缓存之后,在PHP4中一切变得容易多了。 代码如下: //为请求的URI构造一个文件名
$cached_file=md5($REQUEST_URI); if((!file_exists("/cache/$cached_file"))||(!is_valid("/cache/$cached_file"))) { $contents = ob_get_contents(); /如果请求的文件在缓存中且可用,则: ?> 这是一个简单的例子,使用输出缓存,你可以建立一个复杂的内容生成系统,对不同的块或程序使用不同的缓存机制,等等…… 结论 PHP输出控制函数对把脚本生成的输出重定向到缓存中十分有用。为支持gzip的浏览器输出压过的缓存数据可以减少载入时间。也可作为缓存机制来减少对数据源的存取(数据库或文件),这对使用XML意义重大。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |