zoukankan      html  css  js  c++  java
  • Php output buffering缓存及程序缓存

       在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:wwwapachehtdocs est 2.php:2) in D:wwwapachehtdocs est 2.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 '<hr/>';
    $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 '<hr/>';
    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 '<hr/>';
    $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 '<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;

     

    结果:

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

     

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

     

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

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

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

    1 <?php
    2 echo str_repeat('0', 1024);
    3 echo "<br/>";
    4 for($i=1;$i<10;$i++){
    5 echo $i."<br/>";
    6 sleep(1);
    7 //flush();
    8 }

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

     

     

     

     

     

     

     

  • 相关阅读:
    第五次博客作业
    第三次博客作业
    个人简介
    实验三
    实验二
    实验一
    《构建之法》心得体会
    第三次博客园作业
    软件测试实验二
    个人简历
  • 原文地址:https://www.cnblogs.com/HKUI/p/3186276.html
Copyright © 2011-2022 走看看