Php output buffering缓存及程序缓存深入解析

下面测试ob缓存和程序缓存:

在测试前为了测试效果更明显,我们在PHP.ini里先关闭ob缓存并设置明显的错误级别。
display_errors=on

代码1:

代码如下:
echo "PHP";
header("content-type:text/html;charset='utf-8'");
echo 'ok';

则会出现
PHP
Warning: Cannot modify header information - headers already sent by (output started at D:\www\apache\htdocs\test\t2.PHP:2) in D:\www\apache\htdocs\test\t2.PHP on line 3
ok

代码2:

代码如下:
ob_start();
echo "PHP";
header("content-type:text/html;charset='utf-8'");
echo 'ok';

结果就完全正确了

代码1:

PHP在echo ‘PHP'时已经向浏览器发送一个头信息,
当再出现
又看到一个头信息,这时已经打回了上面的头信息,无法更该便出错了。

代码2:

开启了ob缓存,echo ‘PHP'时把要打给浏览器的数据先放到ob缓存里,之后又遇到一个头信息,也放入Ob缓存,页面结束时再按http协议到程序缓存后返回给浏览器。
为加深理解再看以下代码

代码3:

代码如下:
ob_start();
echo "PHP";
header("content-type:text/html;charset='utf-8'");
echo 'ok';
echo '
';
$ob=ob_get_contents();
echo $ob;

输出

Ob_get_contents()只是取得ob缓存里的内容而不清楚它们
Ob_get_contents()必须在ob缓存没有清除前使用

代码4:

代码如下:
ob_start();
echo "PHP";
ob_clean();//清除缓存内容但不关闭缓存区,还能用(往里添加东西)
header("content-type:text/html;charset='utf-8'");
echo 'ok';
echo '
';
$ob=ob_get_contents();
echo $ob;

结果:

代码5:

代码如下:
ob_start();
echo "PHP";
ob_end_clean();//清空缓存内容关闭缓存区,ob_get_contents取不到内容
header("content-type:text/html;charset='utf-8'");
echo 'ok';
echo '
';
$ob=ob_get_contents();
echo $ob;

结果:

代码6:
代码如下:
ob_start();
echo "PHP";
ob_end_flush();//把缓存送到程序缓存内并关闭ob缓存
header("content-type:text/html;charset='utf-8'");
echo 'ok';
echo '
';
$ob=ob_get_contents();
echo $ob;

代码7:对比代码6 与ob_flush()比较
代码如下:
ob_start();
echo "PHP";
ob_flush();//把Ob 缓存送到程序缓存,不关闭ob缓存
header("content-type:text/html;charset='utf-8'");
echo 'ok';
echo '
';
$ob=ob_get_contents();
echo $ob;

结果:

Ob_clean()
清空ob缓存内容但不关闭
Ob_get_flush()
冲刷出缓存到程序缓存,关闭ob缓存

代码8:

代码如下:
Ob_start();
echo 'abc';
header("content-type:text/html;charset='utf-8'");
echo 'hello';
Ob_flush();
echo 'aa';
echo ob_get_contents();
//abchelloaaaa

代码9:

代码如下:
ob_start();
echo 'a';
flush();//把Ob缓存冲刷到程序缓存再冲刷到浏览器输出,不影响ob缓存
echo ob_get_contents();
//aa

代码10:
代码如下:
ob_start();
echo 'a';
ob_flush();//把Ob缓存冲刷到程序缓存,ob里没有了缓存内容
echo "
ob_con".ob_get_contents();
//a 是按正常输出的,Ob里没内容

程序缓存:

代码11:

代码如下:
echo str_repeat(" ",1024);//一些版本的 Microsoft Internet Explorer 只有当接受到的256个字节以后才开始显示页面,所以必须发送一些额外的空格来让这些浏览器显示页面内容
for($i=0;$i<5;$i++){
echo $i;
echo "
";
sleep(1);
flush();
}

会一秒输出一个数字
如果没有flush();会把所有的输出先暂存在程序缓存里,等完毕在整体返回给浏览器 这个例子说明了程序缓存

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...