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

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

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

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

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

1 <?php
2 ob_start();
3 echo "Hello world, this is http://www.hitoy.org/";
4 $content = ob_get_contents();
5 ob_end_clean();
6 echo str_replace("http://","https://",$content);
7 ?>

上面中的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函数输出;第二点是一些有些浏览器对一次接收的文字长度有限制,如果太少,则不予显示。所以这样的代码可以分段显示:

1 <?php
2 echo "这里是第一行数据";
3 echo str_repeat(" ",1024);
4 echo "这里是第二行数据,下面睡眠5秒";
5 flush();
6 sleep(5);
7 echo "这里是第三行数据,下面是HTML代码";
8 ?>
9 <h1>标题</h1>

当然在实际生产环境,直接把output_buffering关闭的情况比较少见,我们可以通过ob_系列函数来进行操作,下面的例子是利用缓冲进行服务器推送(comet)的示例。如下代码可以给客户端进行信息推送:

01 <?php
02 ob_start();
03 $i=0;
04 while($i<100){
05     echo $i.str_repeat(" ",2024);
06     $i++;
07     ob_flush();
08     flush();
09     sleep(5);
10 }
11 ?>

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

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

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

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

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

1 <?php
2 ob_start();
3 echo "Hello world, this is http://www.hitoy.org/";
4 $content = ob_get_contents();
5 ob_end_clean();
6 echo str_replace("http://","https://",$content);
7 ?>

上面中的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函数输出;第二点是一些有些浏览器对一次接收的文字长度有限制,如果太少,则不予显示。所以这样的代码可以分段显示:

1 <?php
2 echo "这里是第一行数据";
3 echo str_repeat(" ",1024);
4 echo "这里是第二行数据,下面睡眠5秒";
5 flush();
6 sleep(5);
7 echo "这里是第三行数据,下面是HTML代码";
8 ?>
9 <h1>标题</h1>

当然在实际生产环境,直接把output_buffering关闭的情况比较少见,我们可以通过ob_系列函数来进行操作,下面的例子是利用缓冲进行服务器推送(comet)的示例。如下代码可以给客户端进行信息推送:

01 <?php
02 ob_start();
03 $i=0;
04 while($i<100){
05     echo $i.str_repeat(" ",2024);
06     $i++;
07     ob_flush();
08     flush();
09     sleep(5);
10 }
11 ?>

最新文章

  1. Lind.DDD.Events领域事件介绍
  2. ubuntu静态DNS配置,重启继续生效
  3. aehyok.com的成长之路二——技术选型
  4. cocos2dx游戏开发——微信打飞机学习笔记(四)——GameScene的搭建
  5. oracle 10G以上版本 树形查询新加的几个功能
  6. String str 与 String str=new String(&quot;&quot;) 区别
  7. WPF:警惕TextBox会占用过多内存
  8. select联动遇到的问题
  9. BZOJ5207 : [Jsoi2017]隧道
  10. python遍历本地文件系统 按文件大小排序
  11. linux下文件共享的几种常用方式
  12. OSI的七层模型介绍
  13. 【转载】C++文件读写详解(ofstream,ifstream,fstream)
  14. HDU 1083 Courses(二分图匹配模板)
  15. fiddler 发送get请求
  16. 唯品会RPC服务框架与容器化演进--转
  17. java线程dump分析工具
  18. appium使用
  19. role是一个HTML5的属性
  20. vue中使用ueditor富文本编辑框

热门文章

  1. 使用c++代替使用的c包!
  2. C++安全异常std:auto_ptr
  3. 解决popup不随着window一起移动的问题
  4. Apache 配置两个域名匹配的文件夹和配置多个Web站点
  5. WPF 页面切换效果
  6. Xml格式的Bared和Warpped
  7. 去掉 Windows 中控件的虚线框(当当 element == QStyle::PE_FrameFocusRect 时,直接返回,不绘制虚线框)
  8. QRCode二维码生成方案及其在带LOGO型二维码中的应用(2)
  9. ASP CRUD
  10. VMNET 工作站