• 技术文章 >后端开发 >php教程

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

    2016-06-01 12:03:59原创251
    下面测试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 '
    ';
    $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

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

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    上一篇:浅析php学习的路线图_PHP 下一篇:在windows平台上构建自己的PHP实现方法(仅适用于php5.2)_PHP

    相关文章推荐

    • PHP ARRAY 数组函数(专题)• PHP框架开发1(首言) • 没有CSS和JavaScript的基础,如何学好PHP?求指教 • 急求:关于PHP实时向客户端输出数据的有关问题 • sql特殊字符有关问题新手各位大牛

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网