源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

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

  • 时间:2021-01-08 14:42 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:Php output buffering缓存及程序缓存深入解析
[b]下面测试ob缓存和程序缓存: [/b]在测试前为了测试效果更明显,我们在php.ini里先关闭ob缓存并设置明显的错误级别。 Output_buffering=off Display_errors=on [b]代码1: [/b]
[u]复制代码[/u] 代码如下:
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 [b]代码2: [/b]
[u]复制代码[/u] 代码如下:
ob_start();  echo "php";  header("content-type:text/html;charset='utf-8'");  echo 'ok';
结果就完全正确了 [b]原因分析: 代码1:[/b]Php在echo ‘php'时已经向浏览器发送一个头信息, 当再出现 header("content-type:text/html;charset='utf-8'"); 又看到一个头信息,这时已经打回了上面的头信息,无法更该便出错了。 [b]代码2:[/b]开启了ob缓存,echo ‘php'时把要打给浏览器的数据先放到ob缓存里,之后又遇到一个头信息,也放入Ob缓存,页面结束时再按http协议到程序缓存后返回给浏览器。 为加深理解再看以下代码 [b]代码3: [/b]
[u]复制代码[/u] 代码如下:
ob_start(); echo "php"; header("content-type:text/html;charset='utf-8'"); echo 'ok'; echo '<hr/>'; $ob=ob_get_contents(); echo $ob;
[b]会输出 [/b] [b][img]http://files.jb51.net/file_images/article/201307/201307150918302.png[/img] [/b] Ob_get_contents()只是取得ob缓存里的内容而不清楚它们 Ob_get_contents()必须在ob缓存没有清除前使用 [b]代码4: [/b]
[u]复制代码[/u] 代码如下:
ob_start();  echo "php";  ob_clean();//清除缓存内容但不关闭缓存区,还能用(往里添加东西)  header("content-type:text/html;charset='utf-8'");  echo 'ok';  echo '<hr/>';  $ob=ob_get_contents();  echo $ob;
[b]结果:[/b] [b][img]http://files.jb51.net/file_images/article/201307/201307150918303.png[/img] 代码5: [/b]
[u]复制代码[/u] 代码如下:
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;
[b]结果:[/b] [b][img]http://files.jb51.net/file_images/article/201307/201307150918304.png[/img] [/b]代码6:
[u]复制代码[/u] 代码如下:
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()比较
[u]复制代码[/u] 代码如下:
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;
[b]结果:[/b] [b][img]http://files.jb51.net/file_images/article/201307/201307150918305.png[/img] [/b]Ob_clean() 清空ob缓存内容但不关闭 Ob_get_flush() 冲刷出缓存到程序缓存,关闭ob缓存 [b]代码8: [/b]
[u]复制代码[/u] 代码如下:
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()与程序缓存 [b]代码9: [/b]
[u]复制代码[/u] 代码如下:
ob_start(); echo 'a'; flush();//把Ob缓存冲刷到程序缓存再冲刷到浏览器输出,不影响ob缓存 echo ob_get_contents(); //aa
代码10:
[u]复制代码[/u] 代码如下:
ob_start(); echo 'a'; ob_flush();//把Ob缓存冲刷到程序缓存,ob里没有了缓存内容 echo "<br/>ob_con".ob_get_contents(); //a     是按正常输出的,Ob里没内容
程序缓存: [b]代码11: [/b]
[u]复制代码[/u] 代码如下:
echo str_repeat(" ",1024);//一些版本的 Microsoft Internet Explorer 只有当接受到的256个字节以后才开始显示该页面,所以必须发送一些额外的空格来让这些浏览器显示页面内容。 for($i=0;$i<5;$i++){ echo $i; echo "<br/>"; sleep(1); flush(); }
会一秒输出一个数字 如果没有flush();会把所有的输出先暂存在程序缓存里,等完毕在整体返回给浏览器 这个例子说明了程序缓存
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部