mod_gzip是Apache模块。它的功能是压缩gzip静态HTML页面。在IETF标准,浏览器可以接受GZIP编码(IE,Netscape等)。mod_gzip可以通过4-5倍增加网页的下载时间。我强烈建议你使用你的Web服务器上的mod_gzip。然而,我们也必须用PHP建立我们自己的压缩引擎。在这篇文章中,我将介绍如何使用PHP输出控制函数来加快页面的加载速度。

介绍PHP的输出控制功能

最满意的事情中,你可以让PHP缓存生成的脚本的所有输出,而浏览器不会在你决定派他们出去得到什么。在脚本,您可以使用这些函数来设置页眉和饼干,但这只是一小部分,强大的输出功能。

复制代码代码如下所示:
< PHP
ob_start虚空(void);
>


告诉PHP处理器将所有输出到内部缓存(buffer),没有将输出发送到浏览器之前,ob_start叫做。

复制代码代码如下所示:
< PHP
字符串ob_get_contents(void);
>


此函数以字符串的形式返回输出缓存(输出缓冲区)。您可以调用此函数将累积的输出发送给浏览器!!)

复制代码代码如下所示:
< PHP
国际ob_get_length(void);
>


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

复制代码代码如下所示:
< PHP
ob_end_clean虚空(void);
>


清除输出缓存并关闭输出缓存。在缓存内容导出到浏览器之前,必须使用此函数。
空501({标记})
它是用来打开/关闭隐含的刷新操作开关(默认情况下)。如果刷新是打开的,输出的内容将立即发送到浏览器侧当打印回波或其他输出命令被调用。

使用输出控件压缩PHP输出
你必须使用zlib扩展包编译php4压缩输出。如果你需要它,你可以看到在PHP文件对zlib包安装说明。
首先,初始化输出缓存:

复制代码代码如下所示:
< PHP
ob_start();
(0)ob_implicit_flush;
>


然后,使用打印、回声或其他任何方式生成所有输出,例如:

复制代码代码如下所示:
< PHP
打印()嘿这是压缩输出!;
>


生成页面时,我们返回输出。

复制代码代码如下所示:
< PHP
内容ob_get_contents美元=();
ob_end_clean();
>


在那之后,这是必要的检测浏览器是否支持压缩数据。如果支持的话,浏览器会发送一个accept-encodeing HTTP头信息在服务器端,我们只需要检查是否有gzip,deflate在$ http_accept_encoding变量字符串。

复制代码代码如下所示:
< PHP
如果(ereg('gzip,放气,http_accept_encoding美元)){
/ /生成gzip压缩的内容在这里
{人}
回波内容;
}
>


这个方法简单易用,结构清晰,让我们看看如何生成下面的压缩输出:

复制代码代码如下所示:
< PHP
/ /告诉浏览器将收到gzip数据
当然你有 /之前,检查他们是否支持gzip,x-gzip格式
/ /如果支持x-gzip,然后头将用来取代z-gzip
标题(内容编码:gzip );

/ /显示gzip文件头
仅显示一次
回声x1fx8bx08x00x00x00x00x00 ;

计算文件的大小和CRC代码。
$大小= strlen($内容);
$ CRC CRC32($内容);

数据压缩
内容= gzcompress美元($内容,9);

我们不能仅仅输出,因为CRC代码是混乱的。
如果我在这里使用回声$内容,压缩数据将被发送,
但是不完整。文件的最后四个字节是CRC校验码,但只有三个字节被发送出去。
/ /最后一个字节是迷路了。我不知道这个bug已经在4.0.2版本解决,
但是最好的避免错误的方法是终止正确的CRC代码到数据压缩。
/ /
旧的/ CRC校验
$内容= substr($内容、0、strlen($内容)- 4);

仅显示压缩数据
回波内容;

输出CRC和原始数据大小(字节)
gzip_printfourchars($ CRC);
gzip_printfourchars(合尺寸);

功能gzip_printfourchars($ Val){
($ i = 0;$ i < 4;$ + +){
Echo Chr($瓦尔% 256);
美元=地板($ 256);
}
}

>
或者,您也可以按此方式添加更多压缩数据。


为了进行实际测试,所有脚本代码如下所示:

复制代码代码如下所示:
< PHP
ob_start();
(0)ob_implicit_flush;

打印(我被压缩了!;

内容ob_get_contents美元=();
ob_end_clean();

标题(内容编码:gzip );

回声x1fx8bx08x00x00x00x00x00 ;

$大小= strlen($内容);
$ CRC CRC32($内容);

内容= gzcompress美元($内容,9);

$内容= substr($内容、0、strlen($内容)- 4);

回波内容;

gzip_printfourchars($ CRC);
gzip_printfourchars(合尺寸);

功能gzip_printfourchars($ Val){
($ i = 0;$ i < 4;$ + +){
Echo Chr($瓦尔% 256);
美元=地板($ 256);
}
}
>


PHP的输出缓存

在PHP4不出来,我不得不用的东西,我在开发一些缓存机制来减少数据库的加载和访问文件系统感兴趣。没有什么特别好的在PHP3,但在输出缓存中,一切都在PHP4更容易。
有一个简单的例子。

复制代码代码如下所示:
< PHP
构建请求文件名
cached_file美元= MD5($ request_uri);

(如果)!file_exists( / /缓存cached_file美元)(is_valid)| |!( / /缓存cached_file美元))){
/ / is_valid函数验证缓存,你可以用这个函数来检查缓存是否过期或其他特定条件。
如果文件不在缓存中,或者不可用以生成输出
ob_start();
(0)ob_implicit_flush;
此输出……

内容ob_get_contents美元=();
ob_end_clean();
费尔= fopen(cached_file美元美元,W);
fwrite(合片、strlen($美元美元的内容,内容));
Fclose($ FIL);
}

如果请求的文件在缓存中,并且可用,
ReadFile($ cached_file);

>


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

结论

PHP输出控制函数重定向脚本的输出缓存是非常有用的。加载缓存数据可以输出减少支持gzip浏览器加载时间。它也可以被用来作为一个缓存机制来减少访问数据源(数据库或文件),以XML利用具有重要意义。
如果我们使用PHP创建一个缓存引擎,从数据源获得的数据(XML和数据库),并动态生成XML格式的内容(无外观呈现)得到的XML输出,并使用XSLT转换任何一个我们想要的外观(HTML、WAP、掌格式pdf,等)。使用PHP4的输出缓存和Sablotron XSLT扩展可以很好的完成这个任务。