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

2015-01-24信息快讯网

在php中有时为了控制程序的输出显示顺序,提供了output buffering缓存(php自身缓存机制)。若Ob缓存开启,需要输出的就先存在ob缓存里,再到程序缓存里。若没有开启,则直接进入程序缓存,程序执行完毕,按照顺序从程序缓存里输出

下面测试ob缓存和程序缓存:
在测试前为了测试效果更明显,我们在php.ini里先关闭ob缓存并设置明显的错误级别。
Output_buffering=off
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'时已经向浏览器发送一个头信息,
当再出现
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 '<hr/>';
$ob=ob_get_contents();
echo $ob;

会输出

Php output buffering缓存及程序缓存深入解析_信息快讯网

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 '<hr/>';
 $ob=ob_get_contents();
 echo $ob;

结果:

Php output buffering缓存及程序缓存深入解析_信息快讯网
代码5:

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;

结果:

Php output buffering缓存及程序缓存深入解析_信息快讯网
代码6:

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()比较
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;

结果:

Php output buffering缓存及程序缓存深入解析_信息快讯网
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 "<br/>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 "<br/>";
sleep(1);
flush();
}

会一秒输出一个数字
如果没有flush();会把所有的输出先暂存在程序缓存里,等完毕在整体返回给浏览器 这个例子说明了程序缓存

php实现上传图片生成缩略图示例
php使用curl和正则表达式抓取网页数据示例
PHP header()函数常用方法总结
开源php中文分词系统SCWS安装和使用实例
PHP获取网页标题的3种实现方法代码实例
PHP扩展模块Pecl、Pear以及Perl的区别
适用于抽奖程序、随机广告的PHP概率算法实例
一个基于phpQuery的php通用采集类分享
PHP设计模式之观察者模式(Observer)详细介绍和代码实例
C#使用PHP服务端的Web Service通信实例
zf框架的zend_cache缓存使用方法(zend框架)
PHP中4个加速、缓存扩展的区别和选用建议
PHP输出缓存ob系列函数详解
PHP APC缓存配置、使用详解
PHP程序漏洞产生的原因分析与防范方法说明
php判断ip黑名单程序代码实例
简单的php缓存类分享 php缓存机制
php实现可以设置中奖概率的抽奖程序代码分享
利用浏览器的Javascript控制台调试PHP程序
实测在class的function中include的文件中非php的global全局环境
PHP 转义使用详解
thinkphp 一个页面使用2次分页的实现方法
shell脚本作为保证PHP脚本不挂掉的守护进程实例分享
PHP 伪静态技术原理以及突破原理实现介绍
php的$_FILES的临时储存文件与回收机制实测过程
深入Nginx + PHP 缓存详解
Apache实现Web Server负载均衡详解(不考虑Session版)
如何解决CI框架的Disallowed Key Characters错误提示
解决PHP mysql_query执行超时(Fatal error: Maximum execution time …)
PHP调用MsSQL Server 2012存储过程获取多结果集(包含output参数)的详解
PHP中使用协同程序实现合作多任务第1/2页
服务器变量 $_SERVER 的深入解析
浅析HTTP消息头网页缓存控制以及header常用指令介绍
PHP 清空varnish 缓存的详解(包括指定站点下的)
解析Linux下Varnish缓存的配置优化
浅析PHP程序防止ddos,dns,集群服务器攻击的解决办法
php抽奖小程序的实现代码
解析:通过php socket并借助telnet实现简单的聊天程序
基于PHP输出缓存(output_buffering)的深入理解
如何用php获取程序执行的时间
©2014-2024 dbsqp.com