博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Php output buffering缓存及程序缓存
阅读量:5254 次
发布时间:2019-06-14

本文共 2846 字,大约阅读时间需要 9 分钟。

   在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';

结果就完全正确了

 

 

原因分析:

代码1Phpecho ‘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;

 

会输出

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 '

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

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

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

 

结果:

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

 

如果ob缓存没开,程序本身还是有缓存的如下图

 

 如果ob缓存没开就直接把输出放入 程序缓存,等脚本执行完毕后所有放在程序缓存的内容返回到用户浏览器,直接走2线路

如果ob缓存开启了,把有输出的地方要输出的内容(不包括头信息) 先放到ob缓存区,由ob函数处理,然后才到程序缓存区,然后脚本结束时 返回到浏览器

如果ob缓存没开启,只有程序缓存,如果某个地方有输出,不会立即返回到浏览器,除非用flush冲刷

1 
";4 for($i=1;$i<10;$i++){5 echo $i."
";6 sleep(1);7 //flush();8 }

如果不冲刷 ,第7行注释,有输出时不会立即输出,会先存到程序缓存区,会等到执行完毕一起返回到浏览器 ,如果有冲刷 有输出时到 程序缓存里的输出会被刷出,会立即返回到浏览器

 

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/HKUI/p/3186276.html

你可能感兴趣的文章
linux脚本中有source相关命令时的注意事项
查看>>
湖南多校对抗赛(2015.03.28) H SG Value
查看>>
REST Web 服务(二)----JAX-RS 介绍
查看>>
hdu1255扫描线计算覆盖两次面积
查看>>
hdu1565 用搜索代替枚举找可能状态或者轮廓线解(较优),参考poj2411
查看>>
bzoj3224 splay板子
查看>>
程序存储问题
查看>>
Mac版OBS设置详解
查看>>
优雅地书写回调——Promise
查看>>
android主流开源库
查看>>
AX 2009 Grid控件下多选行
查看>>
PHP的配置
查看>>
Struts框架----进度1
查看>>
Round B APAC Test 2017
查看>>
MySQL 字符编码问题详细解释
查看>>
perl 学习笔记
查看>>
31 Days of Windows Phone
查看>>
poj 1184(聪明的打字员)
查看>>
Ubuntu下面安装eclipse for c++
查看>>
C#压缩或解压(rar和zip文件)
查看>>