PHP缓存机制Output Control详解
在php5.2版本的配置中,默认output_buffering为关闭状态,因此运行下面三行代码将会出现一个警告:
Warning:Cannotmodifyheaderinformation-headersalreadysent
echo'hello1';
header('content-type:text/html;charset=utf-8');
echo'hello2';
开启OB缓存的方式有如下两种:
1.php.ini中开启output_buffering=4096
启用了此指令,那么每个PHP脚本都相当于一开始就调用了ob_start()函数,PHP5.5默认已开启output_buffering=4096
2.直接在程序中使用ob_start();
打开输出缓冲。当输出缓冲激活后,脚本将不会输出内容(除http标头外),相反需要输出的内容被存储在内部缓冲区中。
内部缓冲区的内容可以用ob_get_contents()函数复制到一个字符串变量中。想要输出存储在内部缓冲区中的内容,可以使用ob_end_flush()函数。另外,使用ob_end_clean()函数会静默丢弃掉缓冲区的内容。
/**
*output_buffering=off情况下测试
*/
ob_start();//开启ob缓存
echo'hello1';//存入ob缓存
header('content-type:text/html;charset=utf-8');//存入程序缓存
//ob_end_clean();//清空ob缓存,并关闭ob缓存
echo'hello2';//存入ob缓存
$str=ob_get_contents();//返回ob缓存的数据(不清除缓冲内容)
file_put_contents('ob.txt',$str);//把$str保存到文件
//ob_clean();//清空ob缓存
echo'hello3';//存入ob缓存
echo'hello4';//存入ob缓存
/*此脚本将生成ob.txt文件,存入hello1hello2,浏览器输出hello1hello2hello3hello4*/
/*若ob_clean()注释打开,那么生成的ob.txt文件中将没有内容,浏览器输出hello3hello4*/
/*若ob_end_clean()注释打开,那么ob.txt中依然没有内容,因为关闭了ob缓存,浏览器输出hello2hello3hello4*/
ob_flush()与ob_end_flush()例子:
ob_start();
echo'abc';//存入ob缓存
header('content-type:text/html;charset=utf-8');//存入程序缓存
echo'hello';//存入ob缓存
ob_flush();//将ob缓存中的内容输出到程序缓存,清空ob缓存,不关闭ob缓存
//ob_end_flush()//将ob缓存中的内容输出到程序缓存,清空ob缓存,关闭ob缓存
echo'aa';//存入ob缓存
echoob_get_contents();
/*最后输出abchelloaaaa*/
/*注释ob_flush,打开ob_end_flush,最后输出abchelloaa*/
注意:
在output_buffering=4096开启的情况下,ob_end_clean()只关闭一次ob缓存(即ob_start开启的),系统的并未关闭。
ob_end_flush()同理。
OB缓存的运行原理/原则:
1.ob缓存打开,echo的数据首先放入ob缓存
2.如果是header信息,直接放在程序缓存
3.当页面执行到最后,会把ob缓存的数据放到程序缓存,然后一次返回给浏览器
最后还有一个flush();强制刷新PHP程序缓存到浏览器缓存。
特性:一些版本的MicrosoftInternetExplorer只有当接受到的256个字节以后才开始显示该页面,所以必须发送一些额外的空格来让这些浏览器显示页面内容。
echostr_repeat('',1024);//重复输出多个字符(解决浏览器缓存256字节之后再输出的情况)
for($i=0;$i<5;$i++)
{
echo$i;
flush();//强制刷新程序缓存到浏览器缓存
sleep(1);//休眠1秒钟,http连接未断开,每隔1秒输出$i
}