Php output buffering缓存及程序缓存深入解析
Php output buffering缓存及程序缓存深入解析
发布时间:2016-12-29 来源:查字典编辑
摘要:下面测试ob缓存和程序缓存:在测试前为了测试效果更明显,我们在php.ini里先关闭ob缓存并设置明显的错误级别。Output_buffer...

下面测试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:wwwapachehtdocstestt2.php:2) in D:wwwapachehtdocstestt2.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 '<hr/>';

$ob=ob_get_contents();

echo $ob;

会输出

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

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 '<hr/>';

$ob=ob_get_contents();

echo $ob;

结果:

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

代码5:

复制代码 代码如下:

ob_start();

echo "php";

ob_end_clean();//清空缓存内容并关闭缓存区,ob_get_contents取不到内容

header("content-type:text/html;charset='utf-8'");

echo 'ok';

echo '<hr/>';

$ob=ob_get_contents();

echo $ob;

结果:

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

代码6:

复制代码 代码如下:

ob_start();

echo "php";

ob_end_flush();//把缓存送到程序缓存内并关闭ob缓存

header("content-type:text/html;charset='utf-8'");

echo 'ok';

echo '<hr/>';

$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 '<hr/>';

$ob=ob_get_contents();

echo $ob;

结果:

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

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 "<br/>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 "<br/>";

sleep(1);

flush();

}

会一秒输出一个数字

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

推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
相关阅读
网友关注
最新php教程学习
热门php教程学习
编程开发子分类