zoukankan      html  css  js  c++  java
  • PHP输出缓冲及其应用

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

    PHP缓冲

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

    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缓冲

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

    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 ?>
  • 相关阅读:
    【1093 Ghajini 线段树】
    【ECJTU_ACM 11级队员2012年暑假训练赛(8) K A short problem】
    【ECJTU_ACM 11级队员2012年暑假训练赛(8) C Asteroids】
    【ECJTU_ACM 11级队员2012年暑假训练赛(7) E Little Elephant and Sorting】
    【ECJTU_ACM 11级队员2012年暑假训练赛(8) F A Mame】
    【hdu 1022 (简单栈题目),,狂敲代码】
    【ECJTU_ACM 11级队员2012年暑假训练赛(8) B Modular Inverse】
    【hdu 1069 Monkey and Banana(动态规划,被坑死。一遍AC)】
    【ECJTU_ACM 11级队员2012年暑假训练赛(7) D Little Elephant and Rozdil】
    【ECJTU_ACM 11级队员2012年暑假训练赛(8) H Petya and Strings】
  • 原文地址:https://www.cnblogs.com/shiwenhu/p/5757374.html
Copyright © 2011-2022 走看看