加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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

发布时间:2020-12-13 06:30:46 所属栏目:PHP教程 来源:网络整理
导读:下面测试ob缓存和程序缓存: 在测试前为了测试效果更明显,我们在php.ini里先关闭ob缓存并设置明显的错误级别。 Display_errors=on 代码1: 代码如下: echo "php"; header("content-type:text/html;charset='utf-8'"); echo 'ok'; 则会出现 php Warning: Cann

下面测试ob缓存和程序缓存:

在测试前为了测试效果更明显,我们在php.ini里先关闭ob缓存并设置明显的错误级别。
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'时已经向浏览器发送一个头信息,
当再出现
又看到一个头信息,这时已经打回了上面的头信息,无法更该便出错了。

代码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:

代码如下:
ob_start();
echo "php";
ob_clean();//清除缓存内容但不关闭缓存区,还能用(往里添加东西)
header("content-type:text/html;charset='utf-8'");
echo 'ok';
echo '
';
$ob=ob_get_contents();
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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读