PHP 输出控制

默认情况下,输出一个字符串到浏览器,经过3个阶段PHP buffer->Tcp buffer->浏览器(IE浏览器有的版本也存在buffer)

PHP默认是打开输出缓冲的,在php.ini中可以配置output_buffering=4096(4kb,一个内存页),设置PHP输出缓冲大小

•flush — 刷新输出缓冲(按我的理解是刷新输出TCP bufer)
•ob_clean — 清空(擦掉)输出缓冲区
•ob_end_clean — 清空(擦除)缓冲区并关闭输出缓冲
•ob_end_flush — 冲刷出(送出)输出缓冲区内容并关闭缓冲
•ob_flush — 冲刷出(送出)输出缓冲区中的内容
•ob_get_clean — 得到当前缓冲区的内容并删除当前输出缓。
•ob_get_contents — 返回输出缓冲区的内容
•ob_get_flush — 刷出(送出)缓冲区内容,以字符串形式返回内容,并关闭输出缓冲区。
•ob_get_length — 返回输出缓冲区内容的长度

(PHP 4, PHP 5, PHP 7)

ob_start — 打开输出控制缓冲

bool ob_start ([ callback $output_callback [, int $chunk_size [, bool $erase ]]] )

此函数将打开输出缓冲。当输出缓冲激活后,脚本将不会输出内容(除http标头外),相反需要输出的内容被存储在内部缓冲区中

由于IE有的版本会有浏览器buffer(256字节),以下代码均在chrome浏览器下运行

1. ob_start使用说明

ob_start(‘replace_content‘);
echo ‘Kevin Durant go to Golden State Warriors!‘;
//David West go to Golden State Warriors!

function replace_content($content){
    return str_replace(‘Kevin Durant‘, ‘David West‘, $content);
}

再看下面的代码

ob_end_clean();//必须关闭系统缓冲区
ob_start(null, 1);
for($i = 1; $i <=10; $i++){
    echo $i,‘<br>‘;
    //ob_flush();
    flush();//输出TCP缓冲
    sleep(1);
}

PHP默认开启了一个输出缓冲区,所以先调用ob_end_clean关闭默认的输出缓冲。由于调用ob_start设置该缓冲区大小为1个字节,所以这段代码会每隔1秒输出。

再看下面的代码也可以做到这个效果

for($i = 1; $i <=10; $i++){
    echo $i,‘<br>‘;
    ob_flush();
    flush();//输出TCP缓冲
    sleep(1);
}

使用了系统默认的输出缓冲区,此时缓冲区大小为默认的4096个字节,所以必须调用ob_flush刷新输出PHP缓冲内容.

2.输出过程

 //PHP默认缓冲区F 1 ob_start();             //缓冲区A
 2 echo ‘champion 1<br />‘;
 3 ob_start();             //缓冲区B
 4 echo ‘champion 2<br />‘;
 5 ob_start();             //缓冲区C
 6 echo ‘champion 3<br />‘;
 7 ob_end_clean();
 8 ob_end_flush();
 9 ob_end_clean();
10 $str = ob_get_contents();
11 echo $str;

运行结果: 没有输出任何东西

可以把整个缓冲区看作一个栈,有新的缓冲区被创建,则新的缓冲区成为栈顶缓冲区。有新内容输出则输出内容会被输出到栈顶的缓冲区。

本程序缓冲区层次: C->B->A->F

初始F:null

运行 1.ob_start(); 后,新建缓冲区A,此时整个缓冲区情况

A:null->F:null

运行 2.echo ‘level 1<br />‘; 后

内容输出到缓冲区A,此时整个缓冲区情况

A:’level 1<br />’ -> F:null

运行 3.ob_start(); 后,新建缓冲区B,此时整个缓冲区情况

B:null -> A:’level 1<br />’ -> F:null

运行 4.echo ‘level 1<br /\>‘; 后

内容输出到缓冲区B,此时整个缓冲区情况

B:’level 2<br />’ -> A: ‘level 1<br />’ -> F:null

以此类推建立缓冲区C,运行到 6.echo ‘level 3<br />‘; 后,此时整个缓冲区情况

C:’level 3<br />’ -> B:’level 2<br />’ -> A: ‘level 1<br />’ -> F:null

接着运行 7.ob_end_clean(); ,缓冲区C被清空且关闭,此时缓冲区情况

B:’level 2<br />’ -> A: ‘level 1<br />’ -> F:null

接着运行 8.ob_end_flush(); ,缓冲区B的内容输出到上一级的缓冲区且缓冲区B被关闭。此时缓冲区情况

A: ‘level 2<br /> level 1<br />’ -> F:null

接着运行 9.ob_end_clean(); ,缓冲区A被情况且关闭。A的内容还没有真正输出到缓冲区F中就被关闭了,最后只剩F:null,因此程序就没有任何输出了。

可使用ob_get_level()获取输出缓冲机制的嵌套级别

3.ob_clean(), ob_end_clean(),  ob_flush(),  ob_end_flush()的区别

开始真是傻傻分不清楚,简单的说ob_end_clean()和ob_end_flush()会关闭当前缓冲区,而ob_clean(),ob_flush()不会.

echo ‘champion1<br>‘;
ob_start();
echo ‘champion2<br>‘;
ob_end_clean();
var_dump(ob_get_contents());
echo ‘champion1<br>‘;
ob_start();
echo ‘champion2<br>‘;
ob_enb_clean();
var_dump(ob_get_contents());

相信你可以判断出输出的结果啦。

我们用GD库输出图片的时候,或者ajax接口输出数据之前我们应该使用ob_clean,因为ob_end_clean会关闭当前输出缓冲区,

很明显使用PHP输出缓冲程序效率会更高。

时间: 2024-10-29 18:45:12

PHP 输出控制的相关文章

cout输出控制——位数和精度控制

刷到一道需要控制输出精度和位数的题目 刚开始以为单纯使用 iomanip 函数库里的 setprecision 就可以,但 OJ 给我判了答案错误,后来一想这样输出并不能限制位数只能限制有效位数. 比如说 0.000101000110 用 setprecision(4) 答案是 0.000101 这里甚至把最后一位的有效数字 0 省略了!! 后来了解到 fixed 关键字 那么在这里若要控制小数点后 N 位 只要写成 cout << fixed << setprecision(N)

[ZigBee] 3、ZigBee基础实验——GPIO输出控制实验-控制Led亮灭

1.CC2530的IO口概述 CC2530芯片有21 个数字输入/输出引脚,可以配置为通用数字I/O 或外设I/O 信号,配置为连接到ADC.定时器或USART外设.这些I/O 口的用途可以通过一系列寄存器配置,由用户软件加以实现. I/O 端口具备如下重要特性:    ?? 21 个数字I/O 引脚 ?? 可以配置为通用I/O 或外部设备I/O ?? 输入口具备上拉或下拉能力 ?? 具有外部中断能力. 21 个I/O 引脚都可以用作于外部中断源输入口.因此如果需要外部设备可以产生中断.外部中断

C++ 控制台代码输出控制

在C++控制台应用程序中可以控制控制台输出的字体颜色和 接受任意按键退出 #ifndef CONSOLE_UTILS_H #define CONSOLE_UTILS_H #include <windows.h> #include <conio.h> #include <iostream> //default text colors can be found in wincon.h inline void SetTextColor(WORD colors) { HANDL

unity中Debug输出控制

1 需求: (1)选择在界面.console中输出,并且能够设置保存到文档 (2)控制debug是否输出,可以在debug模式下输出,release模式下不输出 2 参考: 谢谢雨松同学的博客:http://www.xuanyusong.com/archives/2782 , 雨松飞天般的想法实在太奇妙了,虽然我现在还没有理解里面的原理.雨松把debug类常用函数封装在debuger类中,然后通过封装DLL的方式解决Log输出后的定位的问题. 3 方案:   3.1  Dll生成 Debug输出

105.输出控制缓存

<?php for ($i = 0; $i < 5; $i++) { echo $i; ob_flush(); //如何开启缓存的话,要加这句话 flush(); sleep(1); } 有了解过PHP缓存输出控制函数的朋友肯定对上面这段代码很熟悉,它想实现的效果是每个1秒输出1个数字,完成全部输出需要10秒,不过实际执行中你会发现奇怪的现象,有些人或者有些时候它的表现如你所愿,而有些人或者有些时候却是10秒后才会一次性输出10个数字.我曾经为此抓狂不已,有朋友留言说这个情况往往是因为IE的缓

方法级别的java日志输出控制(二)集群

在方法级别的java日志输出控制(一)这篇文章中主要讨论了通过properties配置文件以及AOP技术批量控制方法级别的日志输出. 用properties配置文件的好处是不用更改程序即可控制日志的输出,然而大型的应用通常是分布式的,会有很多的服务器,需要更改全部服务器上的配置文件,然后再重启应用.这将会是一件非常麻烦的事情.事实上在大型集群应用中有更好的方法实现他.zookeeper的特性决定着它有一个应用场景就是集群配置中心.本文不介绍zookeeper原理以及搭建,将直接使用zookeep

SD--如何在输出控制中增加自定义字段

在sap的输出控制中,我们有时需要增加系统未定义的字段作为条件表的字段,为了实现该需求我们就需要修改增强. 输出控制用到的通讯结构 KOMKBK1 (Output Determination Communication Area CAS Appl. K1) KOMKBV1 (Output Determination Communication Area Header Appl. V1) KOMKBV2 (Output Determination Communication Area Header

基于tcp/ip以太网通信实现0-5v,4-20ma模拟量AI采集以及模拟量AO输出控制-综科智控

ZKA-XXX-ETH 使 用 说 明 书 [ ]绝密 [ ]NDA [X]公开 版本历史 版本 修订日期 修订人 修订内容 1.0 2014-10-13 综科智控 1.0初版正式发布 1.1 2014-12-07 综科智控 填图 1.2 2015-03-01 综科智控 更新配置 1.3 2015-08-13 综科智控 修正组网图 1.4 2015-09-28 综科智控 增加ZKA型号 1.5 2016-05-22 综科智控 增加附件 1.6 2016-11-01 综科智控 修改组网图 1.7

php输出控制output controll(header, ob_xxx)

关于php的output controll参考文档: http://gywbd.github.io/posts/2015/1/php-output-buffer-in-deep.html http://www.cnblogs.com/liuzhang/p/4161213.html 众所周知,调用header()函数之前不能有任何输出到浏览器,否则会报错. 如何复现这种情况: 1.php.ini设置output_buffering OFF 2.测试代码: echo 2; header("HTTP/