php 输出缓冲 Output Control用法实例详解


Posted in PHP onMarch 03, 2020

本文实例讲述了php 输出缓冲 Output Control用法。分享给大家供大家参考,具体如下:

关于php的输出缓冲,首先要说明的是什么是缓冲(buffer),比如我们通过记事本在编辑文件的时候,并不是我们输入了内容,系统就会立刻向磁盘中写入数据。只有我们在保存文件后,系统才会向磁盘写入数据。而之前我们输入的内容全部保存在了文件缓冲区中,只有当缓冲区写满或者执行保存时,数据才会写入磁盘。

而php的输出缓冲也一样,当我们通过echo,print等函数输出时,这些内容首先会保存在output buffer中,php脚本执行完毕或者强制执行缓冲输出操作,内容才会在浏览器上显示。

现在的php版本默认是开启output buffer的,在php.ini

output_buffering = 4096

4096表示缓冲区的大小。

<?php
for($i = 0; $i< 10; ++$i) {
  echo $i, '<br />';
  sleep(1);
}
?>

代码如上,执行的效果并不是我们想要的,浏览器在等待了10秒后,一次性的把0-9输出在了页面上。

原因:默认开启了输出缓冲,当们echo 0;时,实际上是保存在了ob中,然后等待1秒,继续echo 1;直到for循环执行完毕,整个php脚本执行结束,这时php会把缓冲内容一次性发送到浏览器。

那如何才能输出一个数,等待1秒后,再输出下一个数?

方法如下:

1、关闭输出缓冲区
2、自已控制输出缓冲

<?php
//关闭缓冲区
ob_end_clean();
for($i = 0; $i< 10; ++$i) {
  echo $i, '<br />';

  //如果不加flush,则不是一个一个输出
  flush();
  sleep(1);
}
?>

为什么不加flush,程序就不会一个一个输出,php并不是直接输出给浏览器的,而是服务器,php的缓冲关了,但服务器的缓冲还有,所以调用flush把输出发送到用户浏览器。

<?php
for($i = 0; $i< 10; ++$i) {
  echo $i, '<br />';
  ob_flush();
  flush();
  sleep(1);
}
?>

这段代码跟上面的代码效果是一样的,我们通过ob_flush刷新php缓冲,并清空缓冲区内容(但不会关闭缓冲区)。然后调用flush刷新服务器缓冲,输出到浏览器。

ob其他函数的介绍:

<?php
ob_start();
for($i = 0; $i< 10; ++$i) {
  echo $i, '<br />';
}
$str = ob_get_contents();
file_put_contents('./output.txt', $str);
ob_end_clean();
//注意,这里的ob_end_clean()只是关闭了ob_start()打开的缓冲
for($i = 0; $i< 10; ++$i) {
  echo $i, '<br />';
  flush();
  sleep(1);
}
?>

请看上述代码:我们ob_start()开启一个缓冲,for循环输出的内容全部放在了缓冲区中,通过ob_get_contents()来获取缓冲区的内容(只是得到缓冲区内容,缓冲区中的内容还存在)。然后ob_end_clean()清空并关闭缓冲。但下面的for循环输出并没有像我们想的那样一个一个输出。因为php允许存在多个缓冲区,我们这里有两个缓冲区,一个是php已经打开的,一个是我们自已调用ob_start()打开的。

<?php
ob_start();
for($i = 0; $i< 10; ++$i) {
  echo $i, '<br />';
}
$str = ob_get_contents();
file_put_contents('./output.txt', $str);
ob_end_clean();
ob_end_clean();
for($i = 0; $i< 10; ++$i) {
  echo $i, '<br />';
  flush();
  sleep(1);
}
?>

修改成这样,输出结果就是我们想要的了。

<?php
ob_start();
var_dump(ob_get_level());

ob_start();
var_dump(ob_get_level());

ob_end_flush();
ob_end_flush();
?>

我们通过ob_get_level()获取缓冲区的嵌套级别,分别输出int(2) int(3), ob_end_flush()送出缓冲区内容并关闭缓冲。

<?php
echo '111';
echo '222';
ob_clean();
echo '333';
?>

ob_clean()会清空缓冲区,但不会关闭缓冲区。而ob_end_clean()会清空并且关闭。

<?php
ob_start();
echo '111';
echo '222';
$str = ob_get_clean();
echo $str;
echo '333';
$str = ob_get_flush();
file_put_contents('str.txt', $str);

for($i = 0; $i < 10; ++$i) {
  echo $i, '<br />';
  flush();
  sleep(1);
}
?>

代码如下,ob_start()开启一个缓冲,输出111和222,放入缓冲,然后ob_get_clean()获取缓冲内容,并半闭缓冲,返回数据。这时php已打开的缓冲并没有关闭,然后我们把返回的数据输出,再输出333,通过ob_get_flush()送出缓冲内容,返回数据,并关闭缓冲(这时php的缓冲也关了),后面的for循环输出也会一个一个输出。

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
PHP 字符串分割和比较
Oct 06 PHP
php正则表达式(regar expression)
Sep 10 PHP
phpmyadmin显示utf8_general_ci中文乱码的问题终级篇
Apr 08 PHP
PHP 读取大文件的X行到Y行内容的实现代码
Jun 24 PHP
(PHP实现)只使用++运算实现加法,减法,乘法,除法
Jun 27 PHP
如何给phpcms v9增加类似于phpcms 2008中的关键词表
Jul 01 PHP
php实例分享之html转为rtf格式
Jun 02 PHP
php字符串按照单词进行反转的方法
Mar 14 PHP
PHP正则获取页面所有图片地址
Mar 23 PHP
Yii2中添加全局函数的方法分析
May 04 PHP
php封装db类连接sqlite3数据库的方法实例
Dec 19 PHP
PHP设计模式之观察者模式定义与用法分析
Apr 04 PHP
PHP 加密 Password Hashing API基础知识点
Mar 02 #PHP
thinkphp5 + ajax 使用formdata提交数据(包括文件上传) 后台返回json完整实例
Mar 02 #PHP
php加速缓存器opcache,apc,xcache,eAccelerator原理与配置方法实例分析
Mar 02 #PHP
让whoops帮我们告别ThinkPHP6的异常页面
Mar 02 #PHP
php高性能日志系统 seaslog 的安装与使用方法分析
Feb 29 #PHP
PHP中关于php.ini参数优化详解
Feb 28 #PHP
php多进程并发编程防止出现僵尸进程的方法分析
Feb 28 #PHP
You might like
php单链表实现代码分享
2016/07/04 PHP
JavaScript脚本性能的优化方法
2007/02/02 Javascript
jQuery编辑器KindEditor4.1.4代码高亮显示设置教程
2013/03/01 Javascript
自己用jQuery写了一个图片的马赛克消失效果
2014/05/04 Javascript
js函数参数设置默认值的一种变通实现方法
2014/05/26 Javascript
用简洁的jQuery方法toggleClass实现隔行换色
2014/10/22 Javascript
js判断移动端是否安装某款app的多种方法
2015/12/18 Javascript
深入探秘jquery瀑布流的实现
2016/01/30 Javascript
jQuery获取父元素及父节点的方法小结
2016/04/14 Javascript
jquery计算出left和top,让一个div水平垂直居中的简单实例
2016/07/13 Javascript
功能强大的jquery.validate表单验证插件
2016/11/07 Javascript
Angular 4依赖注入学习教程之FactoryProvider配置依赖对象(五)
2017/06/04 Javascript
JS实现为动态创建的元素添加事件操作示例
2018/03/17 Javascript
图文讲解用vue-cli脚手架创建vue项目步骤
2019/02/12 Javascript
[44:01]2018DOTA2亚洲邀请赛3月30日 小组赛B组 EG VS paiN
2018/03/31 DOTA
windows下安装python paramiko模块的代码
2013/02/10 Python
Python的Flask框架与数据库连接的教程
2015/04/20 Python
Python中一些深不见底的“坑”
2019/06/12 Python
Python小程序 控制鼠标循环点击代码实例
2019/10/08 Python
Python分析微信好友性别比例和省份城市分布比例的方法示例【基于itchat模块】
2020/05/29 Python
Python实现一个简单的毕业生信息管理系统的示例代码
2020/06/08 Python
8款精美的CSS3表单设计(登录表单/下拉选择/按钮附演示及源码)
2013/02/04 HTML / CSS
CSS书写规范、顺序和命名规则
2014/03/06 HTML / CSS
CSS3动画和HTML5新特性详解
2020/08/31 HTML / CSS
马来西亚领先的在线礼品店:Giftr
2018/08/23 全球购物
英国Office鞋店德国网站:在线购买鞋子、靴子和运动鞋
2018/12/19 全球购物
荷兰浴室和卫浴网上商店:Badkamerxxl.nl
2020/10/06 全球购物
优秀食品类广告词
2014/03/19 职场文书
环保倡议书500字
2014/05/15 职场文书
会计电算化专业求职信
2014/06/10 职场文书
宣传活动总结范文
2014/07/01 职场文书
生物学专业求职信
2014/07/23 职场文书
正能量励志演讲稿三分钟(范文)
2019/07/11 职场文书
Java SSM配置文件案例详解
2021/08/30 Java/Android
面试分析分布式架构Redis热点key大Value解决方案
2022/03/13 Redis
SQL Server一个字符串拆分多行显示或者多行数据合并成一个字符串
2022/05/25 SQL Server