PHP输出缓冲及其应用的例子

缓冲(buffer)是为了协调吞吐速度相差很大的设备之间数据传送而采用的技术,用来存放缓冲数据的区域叫缓冲区,在计算机科学领域,当数据从一个地方传送到另一个地方时,缓冲区被用来临时存储数据。与缓冲相似的一个技术是缓存(cache),它们都是为了解决数据存储和传输速度不同而带来的问题,不同的是,缓冲主要在写时使用,而缓存主要用来在读时使用。

 


如上图,是一个简易的缓冲区模拟图,左端入口的数据具有单个输入体积小,速度快,数量多,但右端输出数据具有体积大,速度慢的特点。如果没有缓冲区,很容易造成数据堵塞,有了缓冲区之后,当数据填满缓冲区,再统一输出,则可以大大减少系统负担。

php在执行的过程中,嵌入的HTML代码,’echo’,’print_r’等指令都是一次数据输出,正是因为有缓冲区的存在,系统可以在php执行完之后再一次把数据发送给浏览器,运行如下代码:

<?php
echo "这里是第一行数据";
echo "这里是第二行数据,下面睡眠5秒";
sleep(5);
echo "这里是第三行数据,下面是HTML代码";
?>
<h1>标题</h1>

发现浏览器是同时显示所有内容,而不是先显示第一行和第二行数据,等待5秒后再显示后面的数据。不仅这样,PHP的缓冲区还提供给我们更加强大的功能,我们可以在数据发送之前对其作出捕获,更改等。PHP提供给我们”ob_”系列函数,例如如下代码,可以对某些字符进行替换:

<?php
ob_start();
echo "Hello world, this is http://www.111cn.net/";
$content = ob_get_contents();
ob_end_clean();
echo str_replace("http://","https://",$content);
?>

上面中的ob_start,ob_get_contents,ob_end_clean分别用来开启用户缓冲区,获取缓存内容和关闭缓存区,PHP中所有的输出控制函数有1:
flush — 刷新输出系统缓冲
ob_clean — 清空(擦掉)输出缓冲区
ob_end_clean — 清空(擦除)缓冲区并关闭输出缓冲
ob_end_flush — 冲刷出(送出)输出缓冲区内容并关闭缓冲
ob_flush — 冲刷出(送出)输出缓冲区中的内容
ob_get_clean — 得到当前缓冲区的内容并删除当前输出缓。
ob_get_contents — 返回输出缓冲区的内容
ob_get_flush — 刷出(送出)缓冲区内容,以字符串形式返回内容,并关闭输出缓冲区。
ob_get_length — 返回输出缓冲区内容的长度
ob_get_level — 返回输出缓冲机制的嵌套级别
ob_get_status — 得到所有输出缓冲区的状态
ob_gzhandler — 在ob_start中使用的用来压缩输出缓冲区中内容的回调函数。ob_start callback function to gzip output buffer
ob_implicit_flush — 打开/关闭绝对刷送
ob_list_handlers — 列出所有使用中的输出处理程序。
ob_start — 打开输出控制缓冲
output_add_rewrite_var — 添加URL重写器的值(Add URL rewriter values)
output_reset_rewrite_vars — 重设URL重写器的值(Reset URL rewriter values)

php中,可以通过php.ini的output_buffering来设置缓存,On表示无穷大,Off表示关闭,数字则表示缓冲区的大小(以字节为单位),默认大小是4KB,如果设置成off,则示例一的代码是不是就可以分段在浏览器显示了呢?答案是否定的,有两点需要注意,第一点即使把PHP的缓存关闭,php输出在系统层面也有缓存(可以理解为Linux系统stdout的缓存),必须通过flush函数输出;第二点是一些有些浏览器对一次接收的文字长度有限制,如果太少,则不予显示。所以这样的代码可以分段显示:

<?php
echo "这里是第一行数据";
echo str_repeat(" ",1024);
echo "这里是第二行数据,下面睡眠5秒";
flush();
sleep(5);
echo "这里是第三行数据,下面是HTML代码";
?>
<h1>标题</h1>
<h1>标题</h1>
当然在实际生产环境,直接把output_buffering关闭的情况比较少见,我们可以通过ob_系列函数来进行操作,下面的例子是利用缓冲进行服务器推送(comet)的示例。如下代码可以给客户端进行信息推送:

<?php
ob_start();
$i=0;
while($i<100){
    echo $i.str_repeat(" ",2024);
    $i++;
    ob_flush();
    flush();
    sleep(5);
}
?>

时间: 2024-11-05 18:34:03

PHP输出缓冲及其应用的例子的相关文章

PHP中输出缓冲

在PHP中,当执行echo,print的时候,输出并没有立即通过tcp传给客户端浏览器显示, 而是将数据写入php buffer.php output_buffering机制,意味在tcp buffer之前,建立了一新的队列,数据必须经过该队列.当一个php buffer写满的时候,脚本进程会将php buffer中的输出数据交给系统内核交由tcp传给浏览器显示.所以,数据会依次写到这几个地方echo/pring -> php buffer -> tcp buffer -> browse

关于输出缓冲的讨论(Output buffering)之一

###########################################标题  关于输出缓冲的讨论##整理  Diego Lynn @ 林全国##原作  By Zeev Suraski ######################################### 关于输出缓冲的讨论(Output buffering) 目录 HTTP Header为什么要使用Output Buffering技术Output Buffering的工作原理基本用法高级用法使事情更为简单哈哈,我成功

Output Buffer (输出缓冲)函数的妙用

函数 在PHP编程中, 我们经常会遇到一些直接产生输出的函数, 如passthru(),readfile(), var_dump() 等. 但有时我们想把这些函数的输出导入到文件中,或者先经过处理再输出, 或者把这些函数的输出作为字符串来处理. 这时我们就要用到 Output Buffer(输出缓冲) 函数了. 处理输出缓冲的函数主要有这么几个: ob_start() 开始输出缓冲, 这时PHP停止输出, 在这以后的输出都被转到一个内部的缓冲里. ob_get_contents() 这个函数返回

PHP输出缓冲控制Output Control系列函数详解

  这篇文章主要介绍了PHP输出缓冲控制Output Control系列函数详解,本文讲解了输出缓冲的简介.输出缓冲的作用.php.ini 中的相关配置项.Output Control 函数详解等内容,需要的朋友可以参考下 概述 以前研究过PHP的输入输出缓冲,不过博客搬家以后,原来文章找不到了,今天看到一篇好文,顺便转载过来. 简介 说到输出缓冲,首先要说的是一个叫做缓冲器(buffer)的东西.举个简单的例子说明他的作用:我们在编辑一篇文档时,在我们没有保存之前,系统是不会向磁盘写入的,而是

关于PHP输出缓冲函数的一些使用技巧

本文转自IT摆渡网欢迎转载,请标明出处 更多php文章请阅读 php问题解决 在PHP中, Output Buffer输出缓冲函数可以将一些直接产生输出的函数, 如passthru(),var_dump() 等的结果导入到文件中,或者经过处理再输出, 或者作为字符串来处理,在PHP中,处理输出缓冲的函数主要有以下几个: ob_start() 函数:开始输出缓冲, 此时PHP将停止输出, 在这之后的输出都被暂存在内部的缓冲里供以后使用. ob_get_contents() 函数:返回内部缓冲里的内

PHP 输出缓冲控制(Output Control)详解_php技巧

  php 缓冲简介       其实我对php ob 系列印象还是很模糊,具体怎么玩的,还不是很了解,平时curd,确实对这些内容没有深入.作为phper 甚是惭愧.网上搜了一通,互相copy,代码运行不能出现作者所描述现象,本文良心出品,代码都是作者运行过.   当执行输出的时候,比如 echo,print.输出并没有立即送给 web server, 而是将数据写入 php buffer.php output_buffering 机制好处当然提升性能.其实 php 文件最终在浏览器上显示,走

PHP输出缓冲控制Output Control系列函数详解_php实例

概述 以前研究过PHP的输入输出缓冲,不过博客搬家以后,原来文章找不到了,今天看到一篇好文,顺便转载过来. 简介 说到输出缓冲,首先要说的是一个叫做缓冲器(buffer)的东西.举个简单的例子说明他的作用:我们在编辑一篇文档时,在我们没有保存之前,系统是不会向磁盘写入的,而是写到buffer中,当buffer写满或者执行了保存操作,才会将数据写入磁盘.对于PHP来说,每一次像 echo 这样的输出操作,同样是先写入到了 php buffer 里,在脚本执行完毕或者执行了强制输出缓存操作,数据才会

OutputBuffer(输出缓冲)函数的妙用

在PHP编程中, 我们经常会遇到一些直接产生输出的函数, 如passthru(),readfile(), var_dump() 等. 但有时我们想把这些函数的输出导入到文件中,或者先经过处理再输出, 或者把这些函数的输出作为字符串来处理. 这时我们就要用到 Output Buffer(输出缓冲) 函数了. 处理输出缓冲的函数主要有这么几个: ob_start() 开始输出缓冲, 这时PHP停止输出, 在这以后的输出都被转到一个内部的缓冲里. ob_get_contents() 这个函数返回内部缓

PHP嵌套输出缓冲代码实例

  这篇文章主要介绍了PHP嵌套输出缓冲代码实例,本文讲解嵌套使用ob系列函数的实例,需要的朋友可以参考下 PHP的输出缓存是可以嵌套的.用ob_get_level()就可以输出嵌套级别. 测试发现在cli和浏览器下输出结果不一样(PHP5.4). 手册说明如下: ob_get_level() will always return 0 inside a destructor. This happens because the garbage collection for output buffe