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 }