Php output buffering缓存及法度缓存
添加时间:2013-7-12 点击量:
在php中有时为了把握法度的输出显示次序,供给了output buffering缓存(php自身缓存机制)。
若Ob缓存开启,须要输出的就先存在ob缓存里,再到法度缓存里。若没有开启,则直接进入法度缓存,法度履行完毕,遵守次序从法度缓存里输出。
下面测试ob缓存和法度缓存:
在测试前为了测试结果更明显,我们在php.ini里先封闭ob缓存并设置明显的错误级别。
Output_buffering=off
Display_errors=on
代码1:
1 echo php;
2 header(content-type:text/html;charset=utf-8);
3 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:
1 ob_start();
2 echo php;
3 header(content-type:text/html;charset=utf-8);
4 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;
会输出
Ob_get_contents()只是取得ob缓存里的内容而不清楚它们
Ob_get_contents()必须在ob缓存没有清除前应用
代码4:
1 ob_start();
2 echo php;
3 ob_clean();//清除缓存内容但不封闭缓存区,还能用(往里添加器材)
4 header(content-type:text/html;charset=utf-8);
5 echo ok;
6 echo <hr/>;
7 ¥ob=ob_get_contents();
8 echo ¥ob;
成果:
代码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;
成果:
代码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;
成果:
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中有时为了把握法度的输出显示次序,供给了output buffering缓存(php自身缓存机制)。
若Ob缓存开启,须要输出的就先存在ob缓存里,再到法度缓存里。若没有开启,则直接进入法度缓存,法度履行完毕,遵守次序从法度缓存里输出。
下面测试ob缓存和法度缓存:
在测试前为了测试结果更明显,我们在php.ini里先封闭ob缓存并设置明显的错误级别。
Output_buffering=off
Display_errors=on
代码1:
1 echo php;
2 header(content-type:text/html;charset=utf-8);
3 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:
1 ob_start();
2 echo php;
3 header(content-type:text/html;charset=utf-8);
4 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;
会输出
Ob_get_contents()只是取得ob缓存里的内容而不清楚它们
Ob_get_contents()必须在ob缓存没有清除前应用
代码4:
1 ob_start();
2 echo php;
3 ob_clean();//清除缓存内容但不封闭缓存区,还能用(往里添加器材)
4 header(content-type:text/html;charset=utf-8);
5 echo ok;
6 echo <hr/>;
7 ¥ob=ob_get_contents();
8 echo ¥ob;
成果:
代码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;
成果:
代码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;
成果:
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();会把所有的输出先暂存在法度缓存里,等完毕在整体返回给浏览器 这个例子说了然法度缓存
我所有的自负皆来自我的自卑,所有的英雄气概都来自于我的软弱。嘴里振振有词是因为心里满是怀疑,深情是因为痛恨自己无情。这世界没有一件事情是虚空而生的,站在光里,背后就会有阴影,这深夜里一片寂静,是因为你还没有听见声音。—— 马良《坦白书》