首页 > 作文

控制PHP的输出:缓存并压缩动态页面

更新时间:2023-04-06 12:06:28 阅读: 评论:0

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(&大学录取分数线#8220;hey this is a compresd 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 压缩的内容

} el {

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 compresd!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));
fclo($fil);
}

/如果请求的文件在缓存中且可用,则:
readfile($cached_file);

?>

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

结论

php输出控制函数对把脚本生成的输出重定向到缓存中十分有用。为支持gzip的浏览器输出压过的缓存数据可以减少载入时间。也可作为缓存机制来减少对数据源的存取(数据库或文件),这对使用xml意义重大。
如果我们用php建立一个引擎,缓存从数据源得到的数据(xml文档和数据库),并且动态的生成xml格式的内容(没有外观-prentation)我们可以得到这些xml的输出,并使用xslt转换成任意一种我们想要的外观格式(html, wap, palm, pdf等)。使用php4的输出国庆的手抄报缓存和sablotron xslt扩展可以很好地完成这个任务。

本文发布于:2023-04-06 12:06:27,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/c39d19a7337fb9190416af62d4542381.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:控制PHP的输出:缓存并压缩动态页面.doc

本文 PDF 下载地址:控制PHP的输出:缓存并压缩动态页面.pdf

标签:缓存   代码   函数   数据
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图