Heim > Backend-Entwicklung > PHP-Tutorial > Php output buffering缓存及程序缓存深入解析_PHP教程

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

PHP中文网
Freigeben: 2016-07-21 15:00:42
Original
1179 Leute haben es durchsucht

下面测试ob缓存和程序缓存:
在测试前为了测试效果更明显,我们在php.ini里先关闭ob缓存并设置明显的错误级别。
Output_buffering=off
Display_errors=on
代码1: 

代码如下:

echo "php";
header("content-type:text/html;charset='utf-8'");
echo 'ok';
Nach dem Login kopieren


则会出现
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';
Nach dem Login kopieren


结果就完全正确了

原因分析:
代码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;
Nach dem Login kopieren


会输出


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;
Nach dem Login kopieren


结果:


代码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;
Nach dem Login kopieren


结果:


代码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;
Nach dem Login kopieren


代码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;
Nach dem Login kopieren



结果:


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
Nach dem Login kopieren


2.ob_flush(),flush()与程序缓存
代码9:

代码如下:

ob_start();
echo 'a';
flush();//把Ob缓存冲刷到程序缓存再冲刷到浏览器输出,不影响ob缓存
echo ob_get_contents();
//aa
Nach dem Login kopieren

代码10:

代码如下:

ob_start();
echo 'a';
ob_flush();//把Ob缓存冲刷到程序缓存,ob里没有了缓存内容
echo "ob_con".ob_get_contents();
//a     是按正常输出的,Ob里没内容
Nach dem Login kopieren

程序缓存:
代码11:

代码如下:

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


会一秒输出一个数字
如果没有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教程的内容,更多相关内容请关注PHP中文网(www.php.cn)!


Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage