php.ini输出缓冲开启,【PHP输出】缓冲及其应用

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

b90517681896643d746ed52c8f77d68f.gif

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

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

echo "这里是第一行数据";

echo "这里是第二行数据,下面睡眠5秒";

sleep(5);

echo "这里是第三行数据,下面是HTML代码";

?>

标题

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

ob_start();

echo "Hello world http://www.baidu.com";

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

echo "这里是第一行数据";

echo str_repeat(" ",1024);

echo "这里是第二行数据,下面睡眠5秒";

flush();

sleep(5);

echo "这里是第三行数据,下面是HTML代码";

?>

标题

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

ob_start();

$i=0;

while($i<100){

echo $i.str_repeat(" ",2024);

$i++;

ob_flush();

flush();

sleep(5);

}

?>

转载声明:本站文章若无特别说明,皆为原创,转载请注明来源:少儿编程网,谢谢!^^

*文章为作者独立观点,不代表少儿编程网立场

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值