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 simple_html_dom.php+正则 采集文章代码
Dec 24 PHP
浅析HTTP消息头网页缓存控制以及header常用指令介绍
Jun 28 PHP
PHP生成等比缩略图类和自定义函数分享
Jun 25 PHP
PHP动态输出JavaScript代码实例
Feb 12 PHP
常见的四种POST 提交数据方式(小总结)
Oct 08 PHP
PHP中的switch语句的用法实例详解
Oct 21 PHP
在WordPress的后台中添加顶级菜单和子菜单的函数详解
Jan 11 PHP
php中array_slice和array_splice函数解析
Oct 18 PHP
php cookie 详解使用实例
Nov 03 PHP
PHP中Laravel 关联查询返回错误id的解决方法
Apr 01 PHP
php实现多站点共用session实现单点登录的方法详解
Sep 18 PHP
PHP延迟静态绑定使用方法实例解析
Sep 05 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
Sublime里直接运行PHP配置方法
2014/11/28 PHP
PHP基于socket实现客户端和服务端通讯功能
2017/07/13 PHP
javascript 跳转代码集合
2009/12/03 Javascript
jquery图片延迟加载 前端开发技能必备系列
2012/06/18 Javascript
javascript的解析执行顺序在各个浏览器中的不同
2014/03/17 Javascript
js实现鼠标经过表格行变色的方法
2015/05/12 Javascript
jQuery实现的登录浮动框效果代码
2015/09/26 Javascript
基于Jquery代码实现支持PC端手机端幻灯片代码
2015/11/17 Javascript
javascript弹性运动效果简单实现方法
2016/01/08 Javascript
Ionic快速安装教程
2016/06/03 Javascript
jQuery内容筛选选择器实例代码
2017/02/06 Javascript
jQuery修改DOM结构_动力节点Java学院整理
2017/07/05 jQuery
Bootstrap弹出框之自定义悬停框标题、内容和样式示例代码
2017/07/11 Javascript
用js实现每隔一秒刷新时间的实例(含年月日时分秒)
2017/10/25 Javascript
详解vue使用$http服务端收不到参数
2019/04/19 Javascript
vue 的 solt 子组件过滤过程解析
2019/09/07 Javascript
JS时间戳与日期格式互相转换的简单方法示例
2021/01/30 Javascript
[02:44]DOTA2英雄基础教程 克林克兹
2014/01/15 DOTA
在Linux下使用Python的matplotlib绘制数据图的教程
2015/06/11 Python
python函数形参用法实例分析
2015/08/04 Python
Python实现对一个函数应用多个装饰器的方法示例
2018/02/09 Python
python用户评论标签匹配的解决方法
2018/05/31 Python
python3中os.path模块下常用的用法总结【推荐】
2018/09/16 Python
详解Python设计模式之策略模式
2020/06/15 Python
canvas绘制太极图的实现示例
2020/04/29 HTML / CSS
世界上最好的帽子:Tilley
2016/11/27 全球购物
RUIFIER官网:英国奢侈高级珠宝品牌
2020/06/12 全球购物
行政助理的职责
2013/11/14 职场文书
工程项目经理岗位职责
2013/12/15 职场文书
宿舍使用违章电器检讨书
2014/01/12 职场文书
大学生职业规划范文:象牙塔生活的四年计划
2014/01/14 职场文书
2014年小学语文工作总结
2014/12/20 职场文书
银行服务理念口号
2015/12/25 职场文书
golang 实现时间戳和时间的转化
2021/05/07 Golang
SQL中的三种去重方法小结
2021/11/01 SQL Server
React自定义hook的方法
2022/06/25 Javascript