下面测试ob缓存和程序缓存:
在测试前为了测试效果更明显,我们在php.ini里先关闭ob缓存并设置明显的错误级别。
Output_buffering=off
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'时已经向浏览器发送一个头信息,
当再出现
header("content-type:text/html;charset='utf-8'");
又看到一个头信息,这时已经打回了上面的头信息,无法更该便出错了。
代码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;
登录后复制


会输出

Php output buffering缓存及程序缓存深入解析_PHP教程-LMLPHP

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;
登录后复制


结果:

Php output buffering缓存及程序缓存深入解析_PHP教程-LMLPHP
代码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;
登录后复制


结果:

Php output buffering缓存及程序缓存深入解析_PHP教程-LMLPHP
代码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;
登录后复制



结果:

Php output buffering缓存及程序缓存深入解析_PHP教程-LMLPHP
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
登录后复制


2.ob_flush(),flush()与程序缓存
代码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();会把所有的输出先暂存在程序缓存里,等完毕在整体返回给浏览器 这个例子说明了程序缓存


http://www.bkjia.com/PHPjc/328041.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/328041.htmlTechArticle下面测试ob缓存和程序缓存: 在测试前为了测试效果更明显,我们在php.ini里先关闭ob缓存并设置明显的错误级别。 Output_buffering=off Display_er...

以上就是Php output buffering缓存及程序缓存深入解析_PHP教程的内容,更多相关内容请关注Work网(www.php.cn)!


09-18 13:46