zoukankan      html  css  js  c++  java
  • php 输出缓冲


    <?php ob_start();//开启php输出缓冲区 echo "A"; //"A"会进入php输出缓冲区 ob_flush();//将php输出缓冲区中的内容送到服务器 flush();//刷新服务器的缓冲区 sleep(10);//睡10s echo "B";
    //上述脚本将会先输出"A"并在10s之后输出"B"

    上面的脚本在IE中将不会按照预期的显示,php本身有缓冲、服务器有缓冲、部分IE浏览器也有缓存。(鸟哥的解释:http://www.laruence.com/2010/04/15/1414.html

    1. 一些版本的 Microsoft Internet Explorer 只有当接受到的256个字节以后才开始显示该页面,所以必须发送一些额外的空格来让这些浏览器显示页面内容。
    2. 有些Apache的模块,比如mod_gzip,可能自己进行输出缓存,这将导致flush()函数产生的结果不会立即被发送到客户端浏览器。
    3. 甚至浏览器也会在显示之前,缓存接收到的内容。例如 Netscape 浏览器会在接受到换行或 html 标记的开头之前缓存内容,并且在接受到 </table> 标记之前,不会显示出整个表格。
    <?php
    ob_start();
    echo str_repeat(' ' ,256);    //IE缓存256Bytes
    for ($i=0; $i < 50; $i++) { 
        echo $i;
        ob_flush();
        flush();
        sleep(1);
    }

    ob_start()每次调用将会开启一个缓冲区,可以把整个缓冲区看作一个栈,有新的缓冲区被创建,则新的缓冲区成为栈顶缓冲区。有新内容输出则输出内容会被输出到栈顶的缓冲区。

    <?php
    ob_start();
    echo "A";
    ob_start();
    echo "B";
    //输出AB
    //
    虽然没有使用刷新php缓冲区的函数,但在脚本执行完时缓冲区中的内容自动刷新。
    ob_start();
    echo "A";
    ob_start();
    echo "B";
    echo ob_get_contents();
    //输出ABB
    <?php
    ob_start();
    echo "A";
    ob_start();
    echo "B";
    echo ob_get_contents();
    echo ob_get_contents();
    //输出ABBBB
    <?php
    ob_start();
    echo "A";
    ob_start();
    echo "B";
    echo ob_get_contents();
    echo ob_get_contents();
    ob_end_clean();
    //输出A
    <?php
    ob_start();
    echo "A";
    ob_start();
    echo "B";
    echo ob_get_contents();
    echo ob_get_contents();
    ob_end_clean();
    echo ob_get_contents();
    //输出AA

    其他函数

    flush()//刷新服务器的缓冲
    ob_​start//开启一个php缓冲区
    ob_​flush()//刷新php的缓冲
    ob_​clean//清除php的缓冲
    ob_​end_​clean//清除php的缓冲并关闭php的缓冲区
    ob_​end_​flush//刷新php的缓冲并关闭php的缓冲区
    ob_​get_​clean//获得php缓冲区中的内容并清除php缓冲区的内容
    ob_​get_​contents//获得php缓冲区中的内容
    ob_​get_​flush//获得php缓冲区的内容并刷新php缓冲区
    ob_​get_​length//获得php缓冲区的内容长度
    ob_​get_​level//获得php缓冲区个数
    ob_​implicit_​flush//打开/关闭绝对刷送。代替ob_flush()、flush()组合
    ob_​get_​status//得到所有输出缓冲区的状态,数组形式返回,默认返回最顶层,参数为true时返回所有
    ob_​gzhandler//在ob_start中使用的用来压缩输出缓冲区中内容的回调函数
    ob_​list_​handlers//列出所有使用中的输出处理程序。
    output_​add_​rewrite_​var// 添加URL重写器的值(Add URL rewriter values)
    output_​reset_​rewrite_​vars//重设URL重写器的值(Reset URL rewriter values)

    用法:

    1、获取一些输出类的函数(结构)所输出的内容。(对输出进行"截胡")

    var_dump()、phpinfo()、当然print_r()、echo等

    ob_start();
    var_dump($val);
    $val2=ob_get_clean();

    2、页面缓存

    3、php的GD库处理图片后,只能将图片用imagejpeg()输出,或者写入一个文件。很多时候并不需要这么做。这时候就可以将图片数据保存到变量。(和1类似)

    写在后面:

    php.ini中output_buffering可控制缓存的开闭,值为On/Off/数字(缓存区的大小)

    值为On时,输出默认进缓存区中。

    值为Off时,输出不入缓存。此时可通过ob_start()手动开启一个缓存区。

    值为数字时,设置缓存区的大小,缓存区满之后将自动刷新。

    当output_buffering = 5时:

    echo "1111";
    echo strlen(ob_get_contents());
    
    //输出11114
    echo "11111";
    echo strlen(ob_get_contents());
    
    //输出111110

    第二个例子缓冲区内容“11111”达到了5bytes. php将自动刷新缓冲区,所以 strlen(ob_get_contents());为'0'。然后 '0' 又被送到缓冲区,脚本结束时缓冲区再刷新

  • 相关阅读:
    java 反编译和文档生成器
    java 导入自定义类
    hust 1010 最短循环节点
    KMP算法
    hiho 第119周 最大权闭合子图
    2007 Asia
    hiho 第1周 最长回文子串
    hiho 第118周 网络流四·最小路径覆盖
    hiho 第117周 二分图多重匹配,网络流解决
    成为一名JAVA高级工程师你需要学什么
  • 原文地址:https://www.cnblogs.com/natian-ws/p/6640482.html
Copyright © 2011-2022 走看看