博客首页 注册 建议与交流 排行榜 加入友情链接
推荐 投诉 搜索: 帮助

流水孟春

以前使用的博客 webvista.cublog.cn
lib.cublog.cn
PHP输出处理 拷自 Programming PHP中文版

13.3  输出处理

Handling Output

PHP的输出(Output)通常是通过WEB浏览器进行的。下面介绍一些可以用来高效或方便地处理输出的技术。

13.3.1  输出缓冲

Output Buffering

默认情况下,PHP直接把echo或其他类似命令产生的结果输出到浏览器。不过你也可以使用PHP的输出缓冲函数来把原本要 输出到浏览器的信息输出到缓存中去,并在稍后输出或者取消。这种方法使你能够指定输出生成后的内容长度,捕捉某个函数的输出,或者取消一个内置函数的输 出。

你可以使用ob_start( )函数来打开输出缓冲功能:

ob_start([callback]);

可选的callback 参数是对输出进行后处理(post-processes)的函数的名称。如果指定,则缓冲区刷新时所有输出将传递给指定的函数,该函数应当返回一个输出字符串并发送到浏览器。例如你可以用这种方法把所有“http://www.yoursite.com/”字符串转化为“http://www. mysite.com/”字符串,再输出到浏览器。

当输出缓冲被启用时,所有的输出都被存储到一个内部的缓冲区中。要得到缓冲区长度及内容可以使用ob_get_length( )和ob_get_contents( ):

$len = ob_get_length( );

$contents = ob_get_contents( );

如果没有启用缓冲,这两个函数将返回false。

有两种从缓冲区中清除数据的方法。ob_clean( )函数把缓冲区中的所有数据清除,但不关闭缓冲。ob_end_clean( )函数则在清空数据的同时关闭输出缓冲。

有3种方法发送收集的缓冲数据到浏览器(这个动作被称为缓冲区刷新,buffer flush)。ob_flush( )函数发送缓冲数据到浏览器并清除缓冲区,但不关闭缓冲。flush( )函数不但刷新和清空输出缓冲,而且会尝试让WEB服务器直接发送数据到浏览器。ob_end_flush( )函数发送缓冲数据到WEB服务器并关闭输出缓冲。不管是哪种情况,如果你在ob_start()中指定了一个callback函数,则这个函数会被调用 来决定发送哪些数据到浏览器。

如果你的脚本在结束时,缓冲输出仍然没有被关闭(也就是说你没有使用ob_end_flush( )或者ob_end_clean( )函数),则PHP会自动调用ob_end_flush( )函数来关闭缓冲输出。

以下代码收集phpinfo()函数的输出数据,并可以用来判断你是否安装了GD图形库模块。

ob_start( );

phpinfo( );

$phpinfo = ob_get_contents( );

ob_end_clean( );

if (strpos($phpinfo, "module_gd") === FALSE) {

echo "You do not have GD Graphics support in your PHP, sorry.";

} else {

echo "Congratulations, you have GD Graphics support!";

}

当然,更快捷和简单的确定某个扩展是否可用的方法是选择该扩展提供的一个函数,然后检查该函数是否存在。比如确定GD扩展是否可用,你可以这样写:

if (function_exists('ImageCreate'))

把一个文档中所有http://www.yoursite.com/转化为http://www.mysite.com/,只需要这样做:

<?php // 在文件起始处

ob_start( );

?>

Visit <A HREF="http://www.yoursite.com/foo/bar">our site</A> now!

<?php

$contents = ob_get_contents( );

ob_end_clean( );

echo str_replace('http://www.yoursite.com/', 'http://www.mysite.com/',

$contents);

?>

Visit <A HREF="http://www.mysite.com/foo/bar">our site</A> now!

另一个方法是使用一个callback函数。例如下面这个例子中用rewrite( ) callback函数改变页面的文字:

<?php // 在文件最起始处

function rewrite ($text) {

return str_replace('http://www.yoursite.com/', 'http://www.mysite.com/',

$contents);

}

ob_start('rewrite');

?>

Visit <A HREF="http://www.yoursite.com/foo/bar">our site</A> now!

Visit <A HREF="http://www.mysite.com/foo/bar">our site</A> now!  

13.3.2  压缩输出

Compressing Output  

现在的浏览器都可以压缩和解压缩web页面中的文本信息;服务器端可把已经压缩的文本信息发送到客户端浏览器并在浏览器端解压缩。要自动压缩你的web页面,要像这样对它进行包装:

<?php
     ob_start('ob_gzhandler');
    ?>

内建的ob_gzhandler( )函数被设计用作ob_start( ) 的回调函数。它根据浏览器发送过来的Accept-Encoding 头信息来压缩缓冲的页面。可能的压缩技术有gizp、deflate、或者不进行压缩。

对短小的页面进行压缩是没有太大意义的,因为压缩和解压缩所花费的时间将会超过它发送的时间。但是,对于较大的web页面(大于5KB)来说压缩传输是非常有意义的。

如果不想在每个PHP页面的顶部调用ob_start(), 你也可以在你的php.ini文件中设定output_handler选项的值为一个回调函数来使他对于每一个页面都生效。如果要进行压缩的话,该选项的值应该设定为ob_gzhandler。

发表于: 2007-03-03,修改于: 2007-03-03 20:18,已浏览533次,有评论0条 推荐 投诉

给我留言
版权所有 ChinaUnix.net 页面生成时间:0.01929