<?php
ob_start();//开启php输出缓冲区
echo "A"; //"A"会进入php输出缓冲区
ob_flush();//将php输出缓冲区中的内容送到服务器
flush();//刷新服务器的缓冲区
sleep(10);//睡10s
echo "B";
//上述脚本将会先输出"A"并在10s之后输出"B"

上面的脚本在IE中将不会按照预期的显示,php本身有缓冲、服务器有缓冲、部分IE浏览器也有缓存。(鸟哥的解释:http://www.laruence.com/2010/04/15/1414.html

  1. 一些版本的 Microsoft Internet Explorer 只有当接受到的256个字节以后才开始显示该页面,所以必须发送一些额外的空格来让这些浏览器显示页面内容。
  2. 有些Apache的模块,比如mod_gzip,可能自己进行输出缓存,这将导致flush()函数产生的结果不会立即被发送到客户端浏览器。
  3. 甚至浏览器也会在显示之前,缓存接收到的内容。例如 Netscape 浏览器会在接受到换行或 html 标记的开头之前缓存内容,并且在接受到 </table> 标记之前,不会显示出整个表格。
<?php
ob_start();
echo str_repeat(' ' ,256); //IE缓存256Bytes
for ($i=0; $i < 50; $i++) {
echo $i;
ob_flush();
flush();
sleep(1);
}

ob_start()每次调用将会开启一个缓冲区,可以把整个缓冲区看作一个栈,有新的缓冲区被创建,则新的缓冲区成为栈顶缓冲区。有新内容输出则输出内容会被输出到栈顶的缓冲区。

<?php
ob_start();
echo "A";
ob_start();
echo "B";
//输出AB
//虽然没有使用刷新php缓冲区的函数,但在脚本执行完时缓冲区中的内容自动刷新。
ob_start();
echo "A";
ob_start();
echo "B";
echo ob_get_contents();
//输出ABB
<?php
ob_start();
echo "A";
ob_start();
echo "B";
echo ob_get_contents();
echo ob_get_contents();
//输出ABBBB
<?php
ob_start();
echo "A";
ob_start();
echo "B";
echo ob_get_contents();
echo ob_get_contents();
ob_end_clean();
//输出A
<?php
ob_start();
echo "A";
ob_start();
echo "B";
echo ob_get_contents();
echo ob_get_contents();
ob_end_clean();
echo ob_get_contents();
//输出AA

其他函数

flush()//刷新服务器的缓冲
ob_​start//开启一个php缓冲区
ob_​flush()//刷新php的缓冲
ob_​clean//清除php的缓冲
ob_​end_​clean//清除php的缓冲并关闭php的缓冲区
ob_​end_​flush//刷新php的缓冲并关闭php的缓冲区
ob_​get_​clean//获得php缓冲区中的内容并清除php缓冲区的内容
ob_​get_​contents//获得php缓冲区中的内容
ob_​get_​flush//获得php缓冲区的内容并刷新php缓冲区
ob_​get_​length//获得php缓冲区的内容长度
ob_​get_​level//获得php缓冲区个数
ob_​implicit_​flush//打开/关闭绝对刷送。代替ob_flush()、flush()组合
ob_​get_​status//得到所有输出缓冲区的状态,数组形式返回,默认返回最顶层,参数为true时返回所有
ob_​gzhandler//在ob_start中使用的用来压缩输出缓冲区中内容的回调函数
ob_​list_​handlers//列出所有使用中的输出处理程序。
output_​add_​rewrite_​var// 添加URL重写器的值(Add URL rewriter values)
output_​reset_​rewrite_​vars//重设URL重写器的值(Reset URL rewriter values)

用法:

1、获取一些输出类的函数(结构)所输出的内容。(对输出进行"截胡")

var_dump()、phpinfo()、当然print_r()、echo等

ob_start();
var_dump($val);
$val2=ob_get_clean();

2、页面缓存

3、php的GD库处理图片后,只能将图片用imagejpeg()输出,或者写入一个文件。很多时候并不需要这么做。这时候就可以将图片数据保存到变量。(和1类似)

写在后面:

php.ini中output_buffering可控制缓存的开闭,值为On/Off/数字(缓存区的大小)

值为On时,输出默认进缓存区中。

值为Off时,输出不入缓存。此时可通过ob_start()手动开启一个缓存区。

值为数字时,设置缓存区的大小,缓存区满之后将自动刷新。

当output_buffering = 5时:

echo "1111";
echo strlen(ob_get_contents()); //输出11114
echo "11111";
echo strlen(ob_get_contents()); //输出111110

第二个例子缓冲区内容“11111”达到了5bytes. php将自动刷新缓冲区,所以 strlen(ob_get_contents());为'0'。然后 '0' 又被送到缓冲区,脚本结束时缓冲区再刷新

php 输出缓冲的更多相关文章

  1. PHP输出缓冲(Output Buffering)

    什么是缓冲区? 简单而言,缓冲区的作用就是,把输入或者输出的内容先放进内存,而不显示或者读取.至于为什么要有缓冲区,这是一个很广泛的问题~其实缓冲区最本质的作用就是,协调高速CPU和相对缓慢的IO设备 ...

  2. PHP 输出缓冲控制(Output Control) 学习

    php 缓冲简介 其实我对php ob 系列印象还是很模糊,具体怎么玩的,还不是很了解,平时curd,确实对这些内容没有深入.作为phper 甚是惭愧.网上搜了一通,互相copy,代码运行不能出现作者 ...

  3. php flush()刷新不能输出缓冲的原因分析

    在php程序编写中,flush()的使用率还是挺高的,它在网页表现即时信息效果时发挥了极为重要的作用,比如之前写的php实现限制文件下载速度的代码实例,flush()就起了举足轻重的作用,是进度条实现 ...

  4. PHP输出缓冲控制

    说到输出缓冲,首先要说的是一个叫做缓冲器(buffer)的东西.举个简单的例子说明他的作用:我们在编辑一篇文档时,在我们没有保存之前,系统是不会 向磁盘写入的,而是写到buffer中,当buffer写 ...

  5. PHP输出缓冲控制- Output Control 函数应用详解

    说到输出缓冲,首先要说的是一个叫做缓冲器(buffer)的东西.举个简单的例子说明他的作用:我们在编辑一篇文档时,在我们没有保存之前,系统是不会向磁盘写入的,而是写到buffer中,当buffer写满 ...

  6. perl的输出缓冲

      今天写一个小脚本的时候,需要即时输出当前进度到命令行上,并即时将重要数据写入报告文件中.但是perl默认是有输出缓冲的,显示到命令行上必须以\n结尾才行,输出到文件中,回车了都不行,非得要等缓冲区 ...

  7. PHP中刷新输出缓冲

    http://www.cnblogs.com/mutuan/archive/2012/03/18/2404957.html PHP中刷新输出缓冲buffer是一个内存地址空间,Linux系统默认大小一 ...

  8. PHP中输出缓冲

    在PHP中,当运行echo,print的时候,输出并没有马上通过tcp传给client浏览器显示, 而是将数据写入php buffer.php output_buffering机制,意味在tcp bu ...

  9. (转载)PHP中刷新输出缓冲

    (转载)http://www.cnblogs.com/mutuan/archive/2012/03/18/2404957.html PHP中刷新输出缓冲buffer是一个内存地址空间,Linux系统默 ...

  10. (转载)php flush()刷新不能输出缓冲的原因分析

    (转载)http://www.webkaka.com/tutorial/php/2012/110628/ 在php程序编写中,flush()的使用率还是挺高的,它在网页表现即时信息效果时发挥了极为重要 ...

随机推荐

  1. python-之基本语法

    模块一些函数和类的集合文件,并实现一定的功能,当我们需要使用这些功能的时候,可以直接把相应的模块导入到我们的程序中 import import mode    #导入mode模块 即导入mode模块后 ...

  2. SQL GROUP BY两个列

    首先group by 的简单说明: group by 一般和聚合函数一起使用才有意义,比如 count sum avg等,使用group by的两个要素:   (1) 出现在select后面的字段 要 ...

  3. 使用thumbnailator给图片加水印

    引入方式:Maven <dependency> <groupId>net.coobird</groupId> <artifactId>thumbnail ...

  4. 008-Spring Boot @EnableAutoConfiguration深入分析、内部如何使用EnableAutoConfiguration

    一.EnableAutoConfiguration 1.EnableAutoConfiguration原理 springboot程序入口使用注解@SpringBootApplication,Sprin ...

  5. Map 接口有哪些类

    Map接口 Map提供了一种映射关系,其中的元素是以键值对(key-value)的形式存储的,能够实现根据key快速查找value:Map中的键值对以Entry类型的对象实例形式存在:建(key值)不 ...

  6. 16/7/8_PHP-正则表达式

    什么叫正则表达式 PCRE库函数中,正则匹配模式使用分隔符与元字符组成,分隔符可以是非数字.非反斜线.非空格的任意字符.经常使用的分隔符是正斜线(/).hash符号(#) 以及取反符号(~),例如: ...

  7. Altium Designer chapter9总结

    改善系统的信号完整性和电磁兼容性需要注意如下: (1)系统电源尽量使用稳压输出. (2)高速期间器件与低俗器件隔离,避免低速器件影响高速器件. (3)模拟模块部分与数字模块部分分离. (4)为器件就近 ...

  8. python基础-5.1几种常见的排序算法

    一.冒泡排序(BubbleSort) 步骤: 比较相邻的元素,如果第一个比第二个大,就交换他们两个. 循环一遍后,最大的数就“浮”到了列表最后的位置. 将剩下的数再次循环,直道所有的排序完成 def ...

  9. bash shell for循环

    1 同c一样用四个空格进行缩进 2 每行一条语句,不用分号 3 不用大括号标识代码块,但是要用do/done来标识代码块 4 用双小括号,类似于c的for进行编码 for ((i=1; i<=1 ...

  10. java类从加载、连接到初始化过程

    类加载器 在了解Java的机制之前,需要先了解类在JVM(Java虚拟机)中是如何加载的,这对后面理解java其它机制将有重要作用. 每个类编译后产生一个Class对象,存储在.class文件中,JV ...