PHP_输出缓存(output_buffering)的深入理解,边执行边输出

首先明确一下PHP的输出顺序
1.打开了php输出缓存: echo,print -> php output_buffring -> server buffering -> browser buffering -> browser display
2.未打开php输出缓存: echo,print -> server buffering -> browser buffering -> browser display

另外明确一下浏览器的输出缓存:IE为256Bytes, Chrome与FireFox为1000Bytes,只有输出数据达到了这个长度或者脚本结束浏览器才会将数据输出在页面上

再来说说用到的几个PHP设置和API:
1.php.ini中的output_buffering配置
?Off: 表示关闭PHP输出缓存
?On: 打开无限大的输出缓存
?4096: 打开大小为4096Byte的输出缓存

2.php.ini中的implicit_flush配置
?On: 表示每次输出(如echo,print)后自动调用flush()函数后,直接输出
?Off: 与On相反,每次输出后不会调用flush(),需要等到server buffering满了才会输出,但是我们可以用flush()函数代替它,不开启也没关系,反而更加灵活

3.ob_flush()函数: 取出PHP buffering中的数据,放入server buffering

4.flush()函数: 取出Server buffering的数据,放入browser buffering

5.ob_start()函数:对于这个函数我现在了解的不是很清楚,因为开启后输出就会不受ob_flush()控制,即使使用ob_flush()和flush(),数据也不能立即输出在浏览器上.现在知道的是,如果output_buffering=Off,即使使用了ob_start(),也是无法将输出数据缓存的,而如果output_buffering=On的话,即使不用ob_start(),输出数据也可以被PHP缓存,所以觉得ob_start比较废,暂时不管他

然后我们来看代码吧(设置output_buffering=4096,implicit_flush=Off)

复制代码 代码如下:

<html>
<body>
<?php
// ob_start(); //这玩意开了就会不正常,输出不受ob_flush()控制,不知道到底干嘛用
// echo str_repeat(‘ ‘ ,1000); //IE缓存256Bytes
echo str_repeat(‘ ‘ ,1000); //Chrome和FF缓存1000Bytes,这里用来先将浏览器缓存用掉,但是很疑惑这一行输出为什么没有被output_buffering存起来,而是直接输出了
for($i=0;$i<5;$i++) {
echo $i.‘<br />‘;
ob_flush();
flush();
sleep(1);
}
?>
</body>
</html>

这里代码输出结果是一行一行输出的,具体原理大家参考一下ob_flush()和flush()函数的功效
这两个函数缺了任何一个在我这种设置下都是要等到 0, 1, 2, 3, 4都缓存起来后最后一起输出
最后引用一段Laruence的一段blog,希望对大家的理解有帮助

ob_flush/flush在手册中的描述, 都是刷新输出缓冲区, 并且还需要配套使用, 所以会导致很多人迷惑…

其实, 他们俩的操作对象不同, 有些情况下, flush根本不做什么事情..

ob_*系列函数, 是操作PHP本身的输出缓冲区.

所以, ob_flush是刷新PHP自身的缓冲区.

而flush, 严格来讲, 这个只有在PHP做为apache的Module(handler或者filter)安装的时候, 才有实际作用. 它是刷新WebServer(可以认为特指apache)的缓冲区.

在apache module的sapi下, flush会通过调用sapi_module的flush成员函数指针, 间接的调用apache的api: ap_rflush刷新apache的输出缓冲区, 当然手册中也说了, 有一些apache的其他模块, 可能会改变这个动作的结果..
1.有些Apache的模块,比如mod_gzip,可能自己进行输出缓存,
2.这将导致flush()函数产生的结果不会立即被发送到客户端浏览器。
3. 
4.甚至浏览器也会在显示之前,缓存接收到的内容。例如 Netscape
5.浏览器会在接受到换行或 html 标记的开头之前缓存内容,并且在
6.接受到 </table> 标记之前,不会显示出整个表格。
7. 
8.一些版本的 Microsoft Internet Explorer 只有当接受到的256个
9.字节以后才开始显示该页面,所以必须发送一些额外的空格来让这
10.些浏览器显示页面内容。
所以, 正确使用俩者的顺序是. 先ob_flush, 然后flush,
当然, 在其他sapi下, 不调用flush也可以, 只不过为了保证你代码的可移植性, 建议配套使用.

时间: 2024-10-17 12:46:54

PHP_输出缓存(output_buffering)的深入理解,边执行边输出的相关文章

php 输出缓存的魅力

一:输出缓存介绍 在php所谓的输出缓存,就是代码中的echo 或者其他输出命令在执行的时候是先写入到 php buffer,在脚本执行完或者强制执行输出缓存的命令后,才会把数据输出到浏览器(其中php buffer 就是php.ini中设置的output_buffering ,默认是on,表明无限制大小,可以换成数字来限制大小). 例子: echo 'hlmblog.com'; echo '技术'; echo '分享'; 这两个echo 是按顺序插入到缓冲区的,只有脚本执行完成或者强制执行缓存

PHP输出缓存ob系列函数详解

ob,输出缓冲区,是output buffering的简称,而不是output cache.ob用对了,是能对速度有一定的帮助,但是盲目的加上ob函数,只会增加CPU额外的负担 ob的基本原则:如果ob缓存打开,则echo的数据首先放在ob缓存.如果是header信息,直接放在程序缓存.当页面执行到最后,会把ob缓存的数据放到程序缓存,然后依次返回给浏览器.下面我说说ob的基本作用:  1)防止在浏览器有输出之后再使用setcookie().header()或session_start()等发送

PHP flush sleep 输出缓存控制详解

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

性能调优:理解Set Statistics Time输出

在性能调优:理解Set Statistics IO输出我们讨论了Set Statistics IO,还有如何帮助我们进行性能调优.这篇文章会讨论下Set Statistics Time,它会告诉我们执行一个查询需要的时间. 我们用一个例子来开始. 1 USE AdventureWorks2008r2 2 GO 3 DBCC dropcleanbuffers 4 DBCC freeproccache 5 6 GO 7 SET STATISTICS TIME ON 8 GO 9 SELECT * 1

性能调优:理解Set Statistics IO输出

原文:性能调优:理解Set Statistics IO输出 性能调优是DBA的重要工作之一.很多人会带着各种性能上的问题来问我们.我们需要通过SQL Server知识来处理这些问题.经常被问到的一个问题是:早上这个存储过程运行时间还是可以的,但到了晚上就很慢很慢.对此,我们可以笑着回答:这个存储过程运行多次后,已经累趴了,所以很慢. 存储过程或语句运行时间取决于服务器的工作量.如果在晚上,服务器负担很重的话,你的存储过程可能需要更多的时间来运行,因为它在等待CPU周期(CPU cycle)和IO

IntelliJ IDEA修改Output输出缓存区大小【应对:too much output to process】

IntelliJ IDEA默认的Output输出缓存区大小只有1024KB,超过大小限制的就会被清除,而且还会显示[too much output to process],可通过如下配置界面进行修改(Settings→Editor→Console),单位为KB 如果需要禁用缓存区大小限制就需要修改配置文件idea.properties 配置文件中原有设置: #---------------------------------------------------------------------

php输出缓存控制

一.为什么学习php 输出缓存控制(Output Control)? 答:当然是php 输出缓存控制可以帮我们完成想完成的事情了.那就要从什么是输出缓存控制开始来了解了? 二.什么是php 输出缓存控制(Output Control) 答:由于输出php类似echo输出的时候,首先输出到php buffer里面的.所以我们可以控制这个缓存里面的数据了.当我们echo输出到浏览器的时候,要经历四个步骤:php buffer ----> web server buffer ---->browser

ASP.Net 更新页面输出缓存的几种方法

ASP.Net 自带的缓存机制对于提高页面性能有至关重要的作用,另一方面,缓存的使用也会造成信息更新的延迟.如何快速更新缓存数据,有时成了困扰程序员的难题.根据我的使用经验,总结了下面几种方法,概括了常见的几种情况,如有更好的方法欢迎补充. (1)代码级缓存(对象缓存) Cache 对象 Cache 对象提供代码级的缓存,功能强大,可操作性强.更新这种缓存的方法很简单,只要调用 Cache.Remove(key) 方法就可以清除指定的缓存.代码如下: HttpRuntime.Cache.Remo

MVC输出缓存(Cache:1.输出缓存2.应用程序缓存)

缓存前提概念: 1.使用缓存的目的就是为提供网站性能,减轻对数据库的压力,提高访问的速度. 2.如果使用缓存不当,比不使用缓存造成的影响更恶劣(缓存数据的更新不及时.缓存过多等). 3..net MVC 中有两种相应的缓存技术 :1.应用程序缓存 .2.输出缓存 应用程序缓存和输出缓存的区别 输出缓存:也就是Outputcache 是相对于某个Action或Controller而言.使用的场景包括某个页面的数据更新不是很频繁,不需要每次都从数据库区查询.缓存起来从内存中读取.比如文章详情,排名什