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

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