php的输出缓存及其相关函数

php输出缓存冲开关

在php.ini 中的output_buffering,用来配置php输出缓冲,有一下三类值:

ON:  脚本自动调用ob_start(), 打开输出缓冲区.

OFF: 默认值。关闭缓冲。需要时,可带代码中显式调用ob_start(),来打开php缓存

整数值:脚本自动调用ob_start(), 打开输出缓冲区.并设置缓存的大小为该整数。单位为byte;


PHP的输出顺序

打开缓存( output_buffering 非 Off时,或手动调用了ob_start()) 时的输出顺序:

关闭缓存时( output_buffering 为Off时)



输出规则,在调用了缓存控制函数,或缓存区满时,或请求执行完毕时,将数据逐级存入下级缓存,最终在浏览器中显示!

甚至浏览器也会在显示之前,缓存接收到的内容。例如 Netscape浏览器会在接受到换行或 html 标记的开头之前缓存内容,并且在
接受到 </table> 标记之前,不会显示出整个表格。
一些版本的 Microsoft Internet Explorer 只有当接受到的256个字节以后才开始显示该页面,所以必须发送一些额外的空格来让这些浏览器显示页面内容


php缓存控制函数

1、ob_flush();  将 php缓存 中的数据放入 服务器缓存!
2、flush(); 将服务器缓存 发送至 浏览器缓存!

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

在apache module的sapi下, flush会通过调用sapi_module的flush成员函数指针, 间接的调用apache的api: ap_rflush刷新apache的输出缓冲区, 当然手册中也说了, 有一些apache的其他模块, 可能会改变这个动作的结果.有些Apache的模块,比如mod_gzip,可能自己进行输出缓存,这将导致flush()函数产生的结果不会立即被发送到客户端浏览器。



配置implicit_flush

php.ini中的implicit_flush配置
•On: 表示每次输出(如echo,print)后自动调用flush()函数后,直接输出;  注意 ,当php缓存打开时,依然需要手动调用ob_flush和flush()来实现直接输出;
•Off: 与On相反,每次输出后不会调用flush(),需要等到server buffering满了才会输出,但是我们可以用flush()函数代替它,不开启也没关系,反而更加灵活


ob_flush 和 flush 失效

由于ob_star() 允许开启嵌套的 缓存区,当ob_flush和flush位于2层及以上缓存区时,这两个函数失效!

有效:

output_buffering = Off;

ob_start(); //手动开启缓存区
$level = ob_get_level(); //取得缓存区的级别,此值为1
echo "cache level:{$level}";
for($i=0;$i<5;$i++){
	echo $i." Line<br>";
 	ob_flush();
	flush();
	$j= 0;
	while($j<1000000){
		$j++;
	}
}
ob_end_flush(); //结束缓存区

失效的情况

output_buffering = Off;

<pre name="code" class="php">ob_start(); //手动开启缓存区
$level = ob_get_level(); //取得缓存区的级别,此值为1
ob_start(); //又一次手动开启缓存区,此去嵌套在 缓存区1内
$level = ob_get_level(); //取得缓存区的级别,此值为2
echo "cache level:{$level}";
for($i=0;$i<5;$i++){
	echo $i." Line<br>";
 	ob_flush();
	flush();
	$j= 0;
	while($j<1000000){
		$j++;
	}
}
ob_end_flush(); //结束 缓存区2
ob_end_flush(); //结束 缓存区1

 参考: PHP输出缓冲控制 - Output Control 函数 应用详解 
 

你可能感兴趣的:(flush,ob_flush,ob_start,php输出缓存)