微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

下面测试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:\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';

结果就完全正确了

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返回预支付订单号的接口,目前微信支付所有场景均使用这一接口。下面介绍的是其中NATIVE的支付实现流程与PC端实现扫码支付流程
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返回预支付订单号的接口,目前微信支付所有场景均使用这一接口。下面介绍的是其中APP的支付的配置与实现流程
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户信息这个功能的开发流程。 配置 1.首先得在微信公众平台申请一下微信小程序账号并获取到小程序的AppID和AppSecret https://mp.weixin.qq.com/cgi-bin/loginpage?url=%2Fwxamp%2F
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一款开源且免费商用的后台开发框架,它基于ThinkPHP和Bootstrap两大主流技术构建的极速后台开发框架,它有着非常完善且强大的功能和便捷的开发体验,使我逐渐喜欢上了它。
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛,就离不开通讯了,然后我就想到了长连接。这里本人用的是GatewayWorker框架。
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返回预支付订单号的接口,目前微信支付所有场景均使用这一接口。下面介绍的是其中JSAPI的支付实现流程
服务器优化必备:深入了解PHP8底层开发原理
Golang的网络编程:如何快速构建高性能的网络应用?
Golang和其他编程语言的对比:为什么它的开发效率更高?
PHP8底层开发原理揭秘:如何利用新特性创建出色的Web应用