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个字节以后才开始显示该页面,所以必须发送一些额外的空格来让这些浏览器显示页面内容
接受到 </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()函数代替它,不开启也没关系,反而更加灵活
•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 函数 应用详解