zl程序教程

您现在的位置是:首页 >  后端

当前栏目

PHP缓存机制OutputControl详解

PHP缓存 详解 机制
2023-06-13 09:15:37 时间

在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
}